Вызов процедуры с именем Table в качестве аргумента и присвоение того же типа данных переменным, что и в Table в PL / SQL - PullRequest
2 голосов
/ 03 мая 2020

следующий код Здесь я передаю имя_таблицы в качестве аргумента (я не знаю, как его передать, я просто искал его на stackoverflow и других веб-сайтах и ​​придумал это решение. Очевидно, это способ динамической передачи таблицы, однако Я не знаю логики c позади) к процедуре, а затем использую эту таблицу для получения максимальной и минимальной зарплаты сотрудников из таблицы сотрудников. Ниже приведен код процедуры (он работает хорошо)

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;

Я пытался сделать это, и это также дало мне ошибку по этому поводу.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете использовать следующую процедуру для достижения объявления переменных на основе ввода таблицы

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
1 голос
/ 03 мая 2020

Я думаю, что ваш входной параметр varchar2.

Итак, вызовите процедуру следующим образом:

Begin 
MINMAX('emp');  -- varchar2
END; 
/
...