Как передать несколько значений как один параметр в Oracle SQL - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь обновить значения в нескольких схемах с одинаковым именем таблицы.

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

DECLARE
    v_sql varchar2(500);
    v_schema varchar(30);
    v_prj_id varchar2(4000);
    in_PRJ_ID varchar2(4000);
    v_prj_id := 'B00781728,B00781628,B00781611,A43670001';

    CURSOR c1 is
      SELECT v_prj_id from DUAL;

BEGIN

    OPEN c1;

    FOR i IN (SELECT trim(regexp_substr(v_prj_id, '[^,]+', 1, LEVEL)) l FROM dual CONNECT BY LEVEL <= regexp_count(v_prj_id, ',') + 1 ) LOOP

        FETCH c1 INTO in_PRJ_ID;

        EXIT WHEN c1%NOTFOUND;

        v_sql := 'UPDATE ' || in_PRJ_ID || '.SI_Recipient set email = email ||'';Seshadri.K@iconplc.com'''  ;

        EXECUTE IMMEDIATE v_sql;

    END LOOP;

    CLOSE c1;

END;

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Используйте коллекцию или VARRAY для значений, чтобы вам не приходилось разделять строку с разделителями, и вы можете использовать параметр связывания для значения, которое вы хотите добавить в строку электронной почты:

DECLARE
  v_sql     varchar2(500);
  v_schema  varchar(30);
  v_prj_id  varchar2(4000);
  in_PRJ_ID SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST( 'B00781728','B00781628','B00781611','A43670001' );
BEGIN
  FOR i IN 1 .. in_PRJ_ID.COUNT LOOP
    v_sql := 'UPDATE ' || in_PRJ_ID(i) || '.SI_Recipient'
             || ' set email = email || '';'' || :addr';
    BEGIN
      EXECUTE IMMEDIATE v_sql USING 'Seshadri.K@iconplc.com';
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE( SQLERRM );
    END;
  END LOOP;
END;
/

выходы:

UPDATE B00781728.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist
UPDATE B00781628.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist
UPDATE B00781611.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist
UPDATE A43670001.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist

дБ <> скрипка здесь

0 голосов
/ 08 ноября 2019

Это работает:

Declare
  v_sql varchar2(500);
  v_schema varchar(30);
  v_prj_id varchar2(4000):='B00781728,B00781628,B00781611,A43670001';
BEGIN
  Dbms_Output.Put_Line('v_prj_id='||v_prj_id);
  --
  FOR i IN (SELECT trim(regexp_substr(v_prj_id, '[^,]+', 1, LEVEL)) l
            FROM dual 
            CONNECT BY LEVEL <= regexp_count(v_prj_id, ',') + 1 
           ) LOOP
      --
      Dbms_Output.Put_Line('---------------------');
      --
      --
      v_sql := 'UPDATE ' || i.l|| '.SI_Recipient set email = email ||'';Seshadri.K@iconplc.com'''  ;
      --
      Dbms_Output.Put_Line('v_sql='||v_sql);
      --
      begin
        EXECUTE IMMEDIATE v_sql;
      Exception
        when others then
             Dbms_Output.Put_Line('sqlerrm='||sqlerrm);
      End;
      --
  END LOOP;
END;
/

Вывод:

v_prj_id=B00781728,B00781628,B00781611,A43670001
---------------------
v_sql=UPDATE B00781728.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
---------------------
v_sql=UPDATE B00781628.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
---------------------
v_sql=UPDATE B00781611.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
---------------------
v_sql=UPDATE A43670001.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
Total execution time 344 ms

Поскольку в моем экземпляре oracle у меня нет схем B00781728, B00781628, B00781611, A43670001 Я получаю ошибку ORA-00942 Таблица или представление не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...