如何只使用一次 EXECUTE IMMEDIATE 创建 2 个表?

Posted

技术标签:

【中文标题】如何只使用一次 EXECUTE IMMEDIATE 创建 2 个表?【英文标题】:How to create 2 tables using EXECUTE IMMEDIATE only once? 【发布时间】:2019-05-15 06:49:43 【问题描述】:

我有一个要求,我需要在 PLSQL 块内创建 2 个表。目前我们使用EXECUTE IMMEDIATE。现在的问题是我需要创建 2 个表,但我只能使用一次 EXECUTE IMMEDIATE

有没有办法在PLSQL 中创建表 1) 不使用EXECUTE IMMEDIATE 或 2) 在 EXECUTE IMMEDIATE 的单一用法中创建 2 个表

我尝试如下。以及一些跟踪和错误组合。但没有帮助。 期待如下。

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' ;

【问题讨论】:

我正在尝试但遇到错误。 我尝试在单个字符串中创建 stmts 并使用一个 EXECUTE IMMEDIATE 执行。但是出错了。不确定是语法问题还是 try 本身有问题。 你尝试了什么,你能添加你的代码吗? 【参考方案1】:

我承认这不是很好,但你可以在 plsql 块中的 execute immediate 中运行多个 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。

【讨论】:

嗨.. 我正在寻找类似的东西.. 立即执行'BEGIN CREATE TABLE NEW_TABLE1 AS SELECT T1.*, ''Y'' PROCESS_FLAG FROM T1.PRIMAR_ID IN (300000005137174, 300000005142005); CREATE TABLE NEW_TABLE2 AS SELECT T2.*, ''Y'' PROCESS_FLAG FROM T2.CODE 为 NULL 且 T2.SECONDARY_ID IN (SELECT distinct(T_TEMP.PRIMAR_ID) FROM NEW_TABLE1 T_TEMP WHERE T_TEMP.PROCESS_FLAG = ''Y'' );结束'; 请参考下面..我的评论作为单独的答案。 (为了有一个良好的 SQL 格式) @GokulNath - 您可能需要重新考虑您的问题.. 也许您不需要创建表 - 让它们创建一次.. 让您的代码只进行插入

以上是关于如何只使用一次 EXECUTE IMMEDIATE 创建 2 个表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在此代码中正确使用 oracle EXECUTE IMMEDIATE

EXECUTE IMMEDIATE PL/SQL 块返回类型

oracle中EXECUTE IMMEDIATE是啥意思?如何使用,请用自己理解的语言,通俗的解释出来,谢谢了各位!

通过 EXECUTE IMMEDIATE 从 select 语句中返回一个值

在 PL\SQL 块中使用 EXECUTE IMMEDIATE

EXECUTE IMMEDIATE 插入多行列