我对PL / SQL比较陌生,所以请耐心等待 . 我正在创建两个将在FOR循环游标中使用的表 . 我的目的是在开始时(在游标循环之前)创建这两个表,每当我需要它清除并插入新值时,在游标循环内截断它们,然后在光标循环完成后将它们删除 . (看了一下SO之后,我认为这可以用REF CURSOR来完成,但是我不太清楚如何使用它,所以我决定继续第一种方法 . )
我尝试在DECLARE部分创建表,然后在循环开始之前在BEGIN部分创建表,但它引发错误'ORA-065500和PLS-00103在期望开始函数编译指示时遇到符号CREATE''注意我是在LOOP结束之后但在光标的END部分之前删除表 .
我应该在DECLARE部分之前创建光标外的表,并在光标END部分之后删除它们吗?我认为应该可以在游标中创建永久的oracle表吗?
更新:在此处发布代码 -
1)
DECLARE
CREATE TABLE T1
(
col1 VARCHAR2(128),
col2 VARCHAR2(128),
col3 NUMBER(3) NOT NULL,
col3 FLOAT(100)
);
CREATE TABLE T2 AS
SELECT * FROM other_table WHERE 1 = 0;
CURSOR CUR IS ...
BEGIN
FOR rec IN CUR
LOOP
--Do stuff here
END LOOP;
Drop table T1;
Drop table T2;
END;
/
2)
DECLARE
CURSOR CUR IS ...
BEGIN
CREATE TABLE T1
(
col1 VARCHAR2(128),
col2 VARCHAR2(128),
col3 NUMBER(3) NOT NULL,
col3 FLOAT(100)
);
CREATE TABLE T2 AS
SELECT * FROM other_table WHERE 1 = 0;
FOR rec IN CUR
LOOP
--Do stuff here
END LOOP;
Drop table T1;
Drop table T2;
END;
/
(1)和(2)都不起作用 .
更新 - 我们需要EXECUTE IMMEDIATE吗?我怎么知道什么时候需要EXECUTE IMMEDIATE?我们还需要EXECUTE IMMEDIATE来截断游标中的表吗?
1 回答
通常,您不在PL / SQL过程中执行DDL(创建,更改,删除) . 如果需要一个表来存储一些临时数据,可以为此创建temporary tables . 在你的情况下,我会先创建表格
然后程序看起来像这样
当然这些表在此之后不会被删除,但我想你要定期使用你的PL / SQL程序,而不仅仅是一次,对吧?
如果您仍想在程序中执行DDL,则必须使用dynamic sql(立即执行) . 但是,您必须知道DDL操作执行隐式提交,因此您的过程不会是单个原子事务 .