如何只使用一次 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 语句中返回一个值