我对PL/SQL比较陌生,所以请容忍我。我正在创建两个表,它们将在FOR循环游标中使用。我的目的是在开始时(在游标循环之前)创建这两个表,在需要清除游标循环时在游标循环中截断它们,并插入新值,然后在游标循环完成后将它们删除。(在稍微看了一下之后,我认为这可以用REF游标来完成,但是我不太清楚如何使用它,所以我决定继续使用第一种方法。)
我尝试在声明部分中创建表,然后在循环开始之前在BEGIN部分中创建表,但是它会引发错误'ORA-065500和PLS-00103 -在期望begin函数实用化时遇到符号创建.‘请注意,在循环结束后,但在游标的结束部分之前,我将删除表。
我是否应该在游标外,在声明部分之前创建表,并在游标结束部分之后删除它们?我认为应该有可能在游标中创建永久的甲骨文表?
更新:张贴代码在这里-
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)都不起作用。
更新-我们需要立即执行吗?我怎么知道什么时候需要立即执行?我们是否还需要立即执行以截断游标中的表?
发布于 2015-02-26 17:48:39
通常在PL/SQL过程中不执行DDL(创建、更改、删除)。如果需要一个表来存储一些临时数据,则可以为此目的创建临时表。在您的例子中,我首先创建表
CREATE GLOBAL TEMPORARY TABLE T1
(
col1 VARCHAR2(128),
col2 VARCHAR2(128),
col3 NUMBER(3) NOT NULL,
col3 FLOAT(100)
);
CREATE GLOBAL TEMPORARY TABLE T2 AS
SELECT * FROM other_table WHERE 1 = 0;然后手术就会像这样
DECLARE
CURSOR CUR IS ...
BEGIN
FOR rec IN CUR
LOOP
--Do stuff here
END LOOP;
DELETE FROM T1;
DELETE FROM T2;
END;
/当然,之后不会删除表,但我认为您希望定期使用PL/SQL过程,而不仅仅是一次,对吧?
如果您仍然希望在过程中使用动态sql (立即执行)。但是,您必须知道DDL操作执行隐式提交,因此您的过程不会是一个原子事务。
https://stackoverflow.com/questions/28747859
复制相似问题