0

专家...

我有一个存储过程,我试图将记录写入临时表。作为第一步,我想无条件地删除临时表(它可能不存在),然后根据我们拥有的 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 store 流程:

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。我宁愿不这样做。

谢谢你。

4

1 回答 1

0

我创建了存储过程 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 语句被执行。

这是你的问题吗?

于 2014-07-22T00:49:21.923 回答