专家...
我有一个存储过程,我正在尝试将记录写入临时表。作为第一步,我想无条件地删除临时表(可能不存在),然后根据我们拥有的z表表重新创建表。基本上,我是在一个空表之后,这是一个特定表的重复布局,以便稍后进行比较。
我尝试了一个简单的DROP TABLE,但如果该表尚不存在,那么它就是一个showstopper。我从这里找到了一种方法来创建另一个存储过程,该过程在M_TABLES中查找临时表,如果有记录,则将其删除。我做到了一切都好。
问题是我删除表的SP会丢弃它,但接下来的CREATE TABLE会像使用SAP DBTech JDBC那样做出反应:[288]:不能使用重复的表名。经过多次测试,我确认了drop-table存储过程确实按预期工作。
我想也许我应该添加'commit'但是我得到一个编译错误,不支持该功能。
接下来的两行是相关代码。
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-procedure:
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。我宁愿不这样做。
谢谢。
答案 0 :(得分: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“)没有数据;”被选中,虽然有2个语句,但只有选定的SQL语句被执行。
这是你的问题吗?