在 PL / SQL 中调用名称为 Table 的过程作为参数并将相同的数据类型分配给变量,如 Table
Calling a Procedure with name of Table as argument and assigning same datatype to variables as in Table in PL / SQL
代码如下。我在这里做的是传递 table_name 作为参数(我不知道如何传递它,我只是在 Whosebug 和其他网站上搜索它,并提出了这个解决方案。显然这是一种传递方式table 动态但是,我不知道背后的逻辑)到一个过程,然后使用那个 table 从雇员 table 获得雇员的最高和最低工资。
以下是程序代码(效果很好)
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" 的 Table 确实存在,但我不知道如何将其作为参数传递给过程..
其次,如果你看程序代码,我不得不这样声明变量,
LOWEST emp.SAL%TYPE;
HIGHEST emp.SAL%TYPE;
我可以根据传递的 table(作为参数)将这些更改为数据类型吗?像这样,
LOWEST Employee.SAL%TYPE;
HIGHEST Employee.SAL%TYPE;
我试过这样做,它也给了我一个错误。
我认为你的输入参数是varchar2
。
所以这样调用程序:
Begin
MINMAX('emp'); -- varchar2
END;
/
您可以使用下面的过程来实现基于table输入的变量声明
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
代码如下。我在这里做的是传递 table_name 作为参数(我不知道如何传递它,我只是在 Whosebug 和其他网站上搜索它,并提出了这个解决方案。显然这是一种传递方式table 动态但是,我不知道背后的逻辑)到一个过程,然后使用那个 table 从雇员 table 获得雇员的最高和最低工资。 以下是程序代码(效果很好)
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" 的 Table 确实存在,但我不知道如何将其作为参数传递给过程..
其次,如果你看程序代码,我不得不这样声明变量,
LOWEST emp.SAL%TYPE;
HIGHEST emp.SAL%TYPE;
我可以根据传递的 table(作为参数)将这些更改为数据类型吗?像这样,
LOWEST Employee.SAL%TYPE;
HIGHEST Employee.SAL%TYPE;
我试过这样做,它也给了我一个错误。
我认为你的输入参数是varchar2
。
所以这样调用程序:
Begin
MINMAX('emp'); -- varchar2
END;
/
您可以使用下面的过程来实现基于table输入的变量声明
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