Как создать 2 таблицы, используя EXECUTE IMMEDIATE только один раз? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть требование, когда мне нужно создать 2 таблицы внутри блока PLSQL.В настоящее время мы используем EXECUTE IMMEDIATE.Теперь проблема в том, что мне нужно создать 2 таблицы, но я могу использовать EXECUTE IMMEDIATE только один раз.

Существуют ли способы создания таблиц в PLSQL либо 1) без использования EXECUTE IMMEDIATE или 2) создания 2 таблиц за одно использование EXECUTE IMMEDIATE

Я пробовал, как показано ниже.и некоторые комбинации следов и ошибок.но не помогло.Ожидая, как показано ниже.

EXECUTE IMMEDIATE 
'BEGIN
  CREATE TABLE NEW_TABLE1 AS
  SELECT T1.*,
    ''Y'' PROCESS_FLAG
  FROM TABLE1 T1
  WHERE T1.PRIMAR_ID IN ( 300000005137174 ,300000005142005);
  CREATE TABLE NEW_TABLE2 AS
  SELECT T2.*,
    ''Y'' PROCESS_FLAG
  FROM TABLE2 T2
  WHERE T2.CODE       IS NULL
  AND T2.SECONDARY_ID IN
    (SELECT DISTINCT(T_TEMP.PRIMAR_ID)
    FROM NEW_TABLE1 T_TEMP
    WHERE T_TEMP.PROCESS_FLAG = ''Y''
    );
END' ;

1 Ответ

1 голос
/ 15 мая 2019

Я признаю, что это не очень хорошо, но вы можете запустить несколько execute immediate внутри блока plsql в execute immediate:

begin
    execute immediate '
        begin
            execute immediate ''create table a(c number)'';
            execute immediate ''create table b(c number)'';
        end;
    ';
end;

РЕДАКТИРОВАТЬ:

Согласно вашему комментарию, вы можете запустить следующее.

begin
    execute immediate '
        BEGIN 
            execute immediate ''
                CREATE TABLE NEW_TABLE1 AS 
                SELECT T1.*, ''''Y'''' PROCESS_FLAG
                FROM TABLE1 T1 
                WHERE T1.PRIMAR_ID IN ( 300000005137174 ,300000005142005)
            '';

            execute immediate ''
                CREATE TABLE NEW_TABLE2 AS 
                SELECT T2.*, ''''Y'''' PROCESS_FLAG
                FROM TABLE2 T2
                WHERE T2.CODE IS NULL 
                AND T2.SECONDARY_ID IN (
                    SELECT distinct(T_TEMP.PRIMAR_ID)
                    FROM NEW_TABLE1 T_TEMP
                    WHERE T_TEMP.PROCESS_FLAG = ''''Y''''
                )
            ''; 
        END;
    ';
end;

Также вам может понадобиться переосмыслить вашу проблему.Вам действительно нужно создать таблицу?Можете ли вы не создавать таблицы заранее, а просто сделать простую вставку.Вы можете обойти динамический SQL.

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