【问题标题】:Create Table fails with dup error because it does not recognize table was dropped in preceding statement创建表失败并出现 dup 错误,因为它无法识别表在前面的语句中被删除
【发布时间】:2014-07-18 00:36:22
【问题描述】:

专家...

我有一个存储过程,我试图将记录写入临时表。作为第一步,我想无条件地删除临时表(它可能不存在),然后根据我们拥有的 z-table 表重新创建表。本质上,我在寻找一个空表,它是一个特定表的重复布局,以便稍后进行比较。

我尝试了一个简单的 DROP TABLE,但如果该表尚不存在,这将是一个很好的选择。我从这里找到了一种方法来创建另一个在 M_TABLES 中查找临时表的存储过程,如果有记录则将其删除。我这样做了。都很好。

问题是我删除表的 SP 将删除它,但是接下来的 CREATE TABLE 的反应好像它仍然存在 SAP DBTech JDBC:[288]:不能使用重复的表名。经过几次测试,我确认 drop-table 存储过程确实按预期工作。

我想也许我应该添加一个“提交”,但我收到一个编译错误,表明该功能不受支持。

接下来的两行是相关代码。

CALL "SCHEMA1"."Z_PR_DROP_TABLE"('SCHEMA2', 'ZTB_CV_SCM_AGGR_FRESH');

CREATE TABLE "SCHEMA2"."ZTB_CV_SCM_AGGR_FRESH" AS 
       (select * from "SCHEMA1"."ZTB_CV_SCM_AGGR") WITH NO DATA;

drop 存储过程:

CREATE PROCEDURE "SCHEMA1".Z_PR_DROP_TABLE (schema_name VARCHAR2(50), table_name VARCHAR2(50))
LANGUAGE SQLSCRIPT
AS
BEGIN
    declare sch varchar2(50);
    declare tab varchar2(50);
    declare cnt int := 0;

    sch := trim(upper(:schema_name));
    tab := trim(upper(:table_name));

    select count(*) into cnt from "PUBLIC"."M_TABLES" where schema_name = :sch and table_name = :tab;

    if (:cnt > 0) then
        exec 'DROP TABLE '||:sch||'.'||:tab;
    end if;

End

我的解决方法是手动运行 drop-table-stored-procedure。我宁愿不这样做。

谢谢。

【问题讨论】:

    标签: sql hana


    【解决方案1】:

    我创建了存储过程 Z_PR_DROP_TABLE,这两行在 SQL 控制台中运行时工作

        CALL "SYSTEM"."Z_PR_DROP_TABLE"('SYSTEM', 'ZTB_CV_SCM_AGGR_FRESH');
    
        CREATE TABLE "SYSTEM"."ZTB_CV_SCM_AGGR_FRESH" AS 
              (select * from "PUBLIC"."DUMMY") WITH NO DATA;
    

    结果是

        Statement 'CALL "SYSTEM"."Z_PR_DROP_TABLE"('SYSTEM', 'ZTB_CV_SCM_AGGR_FRESH')' 
        successfully executed in 190 ms 259 µs  (server processing time: 14 ms 16 µs) - Rows Affected: 0 
    
    
        Statement 'CREATE TABLE "SYSTEM"."ZTB_CV_SCM_AGGR_FRESH" AS (select * from "PUBLIC"."DUMMY") WITH NO DATA' 
        successfully executed in 91 ms 585 µs  (server processing time: 13 ms 291 µs) - Rows Affected: 0 
        Duration of 2 statements: 281 ms 
    

    在 SQL 控制台中,如果 "CREATE TABLE "SYSTEM"."ZTB_CV_SCM_AGGR_FRESH" AS (select * from "PUBLIC"."DUMMY") WITH NO DATA;"被选中,虽然有 2 条语句,但只有选中的 SQL 语句被执行。

    这是你的问题吗?

    【讨论】:

    • 感谢您的宝贵时间。不... 在 SQL 控制台中?工作正常。我的问题是,如果将这两个语句放在存储过程中并从那里运行,这两个语句将不会运行。我有一个 SP 背靠背执行这两个语句。 Drop-Table SP 运行良好,但 Create-Table 失败。场景:如果 temp_table (ZTB_CV_SCM_AGGR_FRESH) 存在,Drop-Table SP 将删除它。但是,Create-Table 语句将失败并给出“不能使用重复名称”错误。 === 为什么? -- 临时表 (ZTB_CV_SCM_AGGR_FRESH) 刚刚被删除。 Create-Table 应该在没有问题的情况下创建它。
    • 创建了一个过程CREATE PROCEDURE SYSTEM.Z_PR_DROP_AND_CREATE_TABLE LANGUAGE SQLSCRIPT AS BEGIN CALL "SYSTEM"."Z_PR_DROP_TABLE"('SYSTEM', 'ZTB_CV_SCM_AGGR_FRESH'); CREATE TABLE "SYSTEM"."ZTB_CV_SCM_AGGR_FRESH" AS (select * from "PUBLIC"."DUMMY") WITH NO DATA; END,它成功了!假设问题在于过程在一个模式中并且表在不同的模式中创建,则更改了过程...CALL "SYSTEM"."Z_PR_DROP_TABLE"('TEMP1', 'ZTB_CV_SCM_AGGR_FRESH'); CREATE TABLE "TEMP1"."ZTB_CV_SCM_AGGR_FRESH" AS (select * from "PUBLIC"."DUMMY") WITH NO DATA;。它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多