sql - 调用以表名作为参数的过程,并将与 PL / SQL 中的表中相同的数据类型分配给变量
问题描述
以下是代码。我在这里所做的是将 table_name 作为参数传递(我不知道如何传递它,我只是在 stackoverflow 和其他网站上搜索它,并提出了这个解决方案。显然这是一种动态传递表格的方法但是,我不知道背后的逻辑)到一个程序,然后使用该表从员工表中获取员工的最高和最低工资。以下是过程代码(效果很好)
CREATE or REPLACE PROCEDURE MINMAX (Employee in varchar2)
IS
LOWEST emp.SAL%TYPE;
HIGHEST emp.SAL%TYPE;
BEGIN
execute immediate 'SELECT MIN(SAL) from ' || Employee into LOWEST;
execute immediate 'SELECT MAX(SAL) from ' || Employee into HIGHEST;
DBMS_OUTPUT.PUT_LINE('MINIMUM SALARY is : ' || Lowest );
DBMS_OUTPUT.PUT_LINE('MAXIMUM SALARY is : ' || Highest );
END;
/
这就是我尝试执行它的方式,但它给了我错误。
Begin
MINMAX(emp);
END;
/
这是我得到的错误
ORA-06550: line 2, column 9:
PLS-00357: Table,View Or Sequence reference 'EMP' not allowed in this context
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
名称为“emp”的表确实存在,但我不知道如何将其作为参数传递给过程..
其次,如果你看一下程序代码,我不得不像这样声明变量,
LOWEST emp.SAL%TYPE;
HIGHEST emp.SAL%TYPE;
我可以根据传递的表(作为参数)将这些更改为数据类型吗?像这样,
LOWEST Employee.SAL%TYPE;
HIGHEST Employee.SAL%TYPE;
我试过这样做,它也给了我一个错误。
解决方案
您可以使用以下过程来实现基于表输入的变量声明
CREATE OR replace PROCEDURE Minmax (employee IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'DECLARE
HIGHEST '||employee||'.SAL%TYPE;
LOWEST '||employee||
'.SAL%TYPE;
BEGIN
SELECT MIN(SAL) INTO LOWEST from '|| employee||
';
SELECT MAX(SAL) into HIGHEST from '|| employee||' ;
DBMS_OUTPUT.PUT_LINE(''MINIMUM SALARY is : '' || Lowest );
DBMS_OUTPUT.PUT_LINE(''MAXIMUM SALARY is : ''|| Highest );
END;';
END;
使用执行它
Begin
MINMAX('emp');
END;
输出
MINIMUM SALARY is : 800
MAXIMUM SALARY is : 5000
您还可以将 column_name 作为参数传递,如下所示
CREATE OR replace PROCEDURE Minmax (table_name IN VARCHAR2,column_name in varchar2)
IS
BEGIN
EXECUTE IMMEDIATE 'DECLARE
HIGHEST '||table_name||'.'||column_name||'%TYPE;
LOWEST '||table_name||'.'||column_name||'%TYPE;
BEGIN
SELECT MIN('||column_name||') INTO LOWEST from '|| table_name||
';
SELECT MAX('||column_name||') into HIGHEST from '|| table_name||' ;
DBMS_OUTPUT.PUT_LINE(''MINIMUM '||column_name||' is : '' || Lowest );
DBMS_OUTPUT.PUT_LINE(''MAXIMUM '||column_name||' is : ''|| Highest );
END;';
END;
使用执行它
BEGIN
Minmax('emp','sal');
end;
输出是: -
MINIMUM sal is : 800
MAXIMUM sal is : 5000
推荐阅读
- javascript - Cannot interact with button using javascript
- angular - 我可以停止特定端点的默认角度重定向行为吗?
- python - 如何在有条件的情况下删除txt中的几行
- angular - 修改Angular html文件中变量的值
- java - 从 cmd 运行时遇到 java.lang.NoClassDefFoundError(错误名称:)问题
- python - 给定X和Y的坐标,如何在python中绘制相邻的多边形?
- c++ - 显示/隐藏控件后如何更新窗口的当前状态?
- java - 即使在添加 vm 参数后也找不到模块 javafx.controls
- rust - 无法分配,因为它是在返回包含引用的 Result 的结构的方法中借用的
- php - 在 WooCommerce 中阻止在没有运输方式的情况下访问结帐