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

问题描述

我想做的作业是 “制定程序,将所有出生的总统的姓名放在一个特定的 状态,在一个临时表中。显示该表的内容。“

该过程符合要求,但是当我尝试调用它时,它会给我:

  1. 00000-“表或视图不存在” 错误(8,5):PLS-00103:预期以下情况之一时遇到符号“ CREATE”:begin function pragma procedure子类型类型当前游标已删除

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

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

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;

解决方法

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

Insert into table_name(columns)
   Select columns ... 

由于这显然是一项作业或教程,因此我将为您的研究提供准确的信息。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...