Коллекции Oracle 11g PLSQL в операторе SELECT - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть коллекция таблиц типов в начале блока PLSQL, и мне пришлось использовать ее несколько раз в моем коде.

Есть ли способ использовать список (тип таблицы) в операторе SELECT? Моя цель - написать меньше кода.

Я включил массив (TABLE) непосредственно в оператор SELECT

Ниже показан скрипт, который я пытаюсь сделать, но, видимо, я не могу этого сделать, потому что мы не можем использовать коллекции в выражении SQL (пожалуйста, проверьте оператор delete).

clear Screen
SET SERVEROUTPUT ON
SET linesize 300
SET timing ON

WHENEVER SQLERROR EXIT failure ROLLBACK;
WHENEVER oserror EXIT failure ROLLBACK;

DECLARE
    code_groupe            VARCHAR2 (50 CHAR);
    code_grp               VARCHAR2 (4 CHAR);
    TYPE arrayList is table of varchar2(50);
    site_code_ls arrayList;
BEGIN
    code_grp          := 'ABDE';
    site_code_ls      := arrayList ('D','C','B','A','L');
    DELETE CARP.PLACES_GROUPS
     WHERE CODE_GROUPE = code_grp AND CODE_PLACE NOT IN (SELECT S.CODE
                                                       FROM CARP.PLACE P
                                                      WHERE P.CODE_IMPLANTATION IN site_code_ls;
    COMMIT;
END;
/
exit;

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вы не можете использовать такие локальные коллекции, но вы можете использовать forall, что быстро, как здесь:

declare 
  type tt is table of varchar2(5);
  vt tt := tt('C', 'E', 'N', 'X');
begin 
  forall i in vt.first..vt.last 
    delete from test 
    where name = vt(i);
end;

Здесь вы можете увидеть сравнение скорости forall и for ... loop.

0 голосов
/ 12 апреля 2019

если вы используете oracle 12c, то вы сможете использовать локально определенную коллекцию с оператором table.например,

Select  * 
  from table 
 where column in(select column_value from table(PLACE_code_ls))

или вы можете создать коллекцию как тип объекта

create or replace type arrayList is table of varchar2(100);

и затем использовать ее в своем блоке PLSQL.

DECLARE
...
    PLACE_code_ls arrayList ; -- this is a new created global object type
...

BEGIN   
    code_grp          := '454D';
    PLACE_code_ls      := arrayList ('ABVDE','ADE','EFEF','JHGJ','JHGJH');


    DELETE CARP.assos_place_grp
     WHERE CODE_GROUPE = code_grp AND CODE_PLACE NOT IN (SELECT S.CODE
                                                       FROM CARP.PLACE S
                                                      WHERE S.CODE_IMPLANTATION IN 
                                            (select column_value from table(PLACE_code_ls)); 
                                             -- select from your collection



    COMMIT;
END;
/
...