gpt4 book ai didi

sql - 以表名作为参数调用过程,并为变量分配与 PL/SQL 中的表相同的数据类型

转载 作者:行者123 更新时间:2023-12-04 10:06:23 25 4
gpt4 key购买 nike

以下是代码。我在这里做的是将 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

关于sql - 以表名作为参数调用过程,并为变量分配与 PL/SQL 中的表相同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61568690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com