在 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