如何正确地在Pl/SQL中创建一个过程,在该过程中我创建了一个TABLE并使用了一个CURSOR



我要做的任务是"创建一个程序,将所有出生在一个特定国家的总统的名字状态,在临时表中。显示此表的内容">

程序符合要求,但当我试图调用它时,它会给我:

  1. 00000-";表或视图不存在";错误(8,5(:PLS-00103:遇到符号";CREATE";当期望以下内容之一时:begin函数pragma过程子类型当前游标删除之前存在

我已经被困了一段时间了。有人知道我做错了什么吗?

到目前为止,我的代码是:

CREATE OR REPLACE PROCEDURE stateofpresident(p_state president.state_born%TYPE)
AS
CURSOR c_state IS
SELECT *
FROM president;

BEGIN
execute immediate 'CREATE TABLE presidentFromState;
(
president_name VARCHAR2
)';
FOR r_state IN c_state LOOP
IF(p_state = r_state.state_born) THEN
execute immediate 'INSERT INTO presidentFromState VALUES(r_state.pres_name)';
commit;
END IF;
END LOOP; 
execute immediate 'DROP TABLE presidentFromState';              
END stateofpresident;
/
SET SERVEROUT ON
BEGIN
stateofpresident('VIRGINIA');
END;
/
SELECT *
FROM presidentFromState;

错误的直接原因是"总统FromState"在运行fhat时终止该语句,而SQL解释器此时不知道需要什么,创建语法无效。该语句之所以编译,是因为在编译时它是一个格式正确的字符串。这就是为什么尽可能避免使用动态SQL的原因。您的脚本还有一个额外的错误。您的最后一次选择将失败,因为表presidentFromState不仅已创建,而且已在过程中删除。最后,只需一个FYI,整个FOR游标和游标本身是完全不必要的,整个操作可以完成一句话:查看结构

Insert into table_name(columns)
Select columns ... 

由于这显然是一项作业或教程,我将把确切的内容留给你研究。

最新更新