Oracle SQL: создать процедуру, которая принимает таблицу в качестве входных данных - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы создать процедуру, которая принимает таблицу (T в примере) в качестве входных данных. Однако я не хочу указывать имя таблицы в виде символа и делать что-то «dynamici c», например

begin
    execute immediate ('delete from '||T||' where ...');
end;

, потому что реальная задача, с которой я имею дело, включает в себя несколько входных данных для функции и длинный запрос на выполнение, который имеет много вершин ... строка для выполнения становится действительно грязной и трудной для отладки. Я хотел бы иметь что-то простое, как следующее (что работает):

CREATE or replace PROCEDURE fun (x NUMBER) AS
   BEGIN
      DELETE FROM MyTable WHERE MyTable.var= fun.x;
   END;
/

Однако, давая таблицу в качестве входных данных для процедуры (мне нужно сделать это, потому что в противном случае в реальной задаче я бы необходимо изменить букву «Т» во многих случаях в рамках процедуры) не работает:

CREATE or replace PROCEDURE fun (x NUMBER, T table) AS
   BEGIN
      DELETE FROM T WHERE T.var= fun.x;
   END;
/

Errors for PROCEDURE FUN
----------------------------
L:1 C:32       PLS-00103: Encountered the symbol "TABLE" when expecting one of the following:
                  in out <an identifier> <a double-quoted delimited-identifier>
                  ... long double ref char time timestamp interval date binary
                  national character nchar
               The symbol "<an identifier> was inserted before "TABLE" to continue.
1 statement failed.

Возможно ли иметь что-то близкое к тому, что я хочу?

1 Ответ

0 голосов
/ 30 апреля 2020

Я разработал обходной путь, который, конечно, не изящен, но, согласно комментариям, кажется, что это единственный способ избежать больших кусков динамического кода c «выполнить немедленно».

CREATE or replace PROCEDURE fun (T_in char, T_out char, x number) 
as
   BEGIN

    /* I create a temporary replica with a view */
   execute immediate 'create or replace view tempview as select * from '||T_in;

    /* DO STUFF, for example: */
   delete from tempview where ente_segn = fun.x;

    /* Save the results in a new table */
   execute immediate 'create or replace view '||T_out||'  as select * from tempview';

   END;
/
...