首页 > 解决方案 > 调用以表名作为参数的过程,并将与 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;

我试过这样做,它也给了我一个错误。

标签: sqloracleplsqloracle11g

解决方案


您可以使用以下过程来实现基于表输入的变量声明

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

推荐阅读