如何在 Pl/SQL 中正确创建一个过程,在该过程中我创建一个表并使用一个游标

Posted

技术标签:

【中文标题】如何在 Pl/SQL 中正确创建一个过程,在该过程中我创建一个表并使用一个游标【英文标题】:How to correctly make a procedure in Pl/SQL in which I create a TABLE and use a CURSOR 【发布时间】:2020-09-30 14:59:04 【问题描述】:

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

该过程符合但当我尝试调用它时,它给了我:

    00000 - “表或视图不存在” 错误(8,5):PLS-00103:在预期以下情况之一时遇到符号“CREATE”:开始函数杂注过程子类型当前光标删除之前存在

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

到目前为止我的代码是:

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;

【问题讨论】:

【参考方案1】:

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

Insert into table_name(columns)
   Select columns ... 

因为这显然是一个作业或教程,所以我会留下确切的内容供您研究。

【讨论】:

以上是关于如何在 Pl/SQL 中正确创建一个过程,在该过程中我创建一个表并使用一个游标的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE:错误错误(6,3):PL/SQL:SQL 语句被忽略和错误(8,3):PL/SQL:ORA-00933:SQL 命令未在过程中正确结束

如何使用存储过程创建随机函数? PL/SQL

如何使用输入参数创建 PL/SQL 存储过程以返回数据集

PL/SQL 包 - 在包中调用过程

PL SQL - 使用动态 SQL 生成删除语句

如何在 PL/SQL 中使用包内的过程