Oracle SQL - 无法创建存储过程

Posted

技术标签:

【中文标题】Oracle SQL - 无法创建存储过程【英文标题】:Oracle SQL - Can't Create Stored Procedure 【发布时间】:2016-12-05 00:22:05 【问题描述】:

我在 sqlplus 中遇到问题,我无法执行脚本来创建存储过程。当我尝试运行脚本时,出现以下错误:

PLS-000103:在预期以下情况之一时遇到符号“CREATE”: begin function pragma procedure subtype type current cursor delete 存在先前的外部语言

我认为这可能是一个简单的脚本没有正确运行的情况——当我登录到 sqlplus 时,我只是输入以下内容:

@ASSIGN_PILOT.sql

有什么理由不应该运行吗?有没有一种不同的方式来调用脚本来创建存储过程,或者类似的东西?我的脚本如下。我知道其中可能有很多错误,但一旦我可以开始运行这个东西,我会很乐意解决它们。

create or replace procedure ASSIGN_PILOT (param_flno int, param_distance int, param_origin char) as

--get all pilot/aircraft combos that can make the trip (call it pilots)
CREATE TABLE pilots
AS
SELECT e.eid, ename, a.aid, cruisingrange
FROM employees1 e
INNER JOIN certified1 c
ON e.eid=c.eid
INNER JOIN aircraft a
ON c.aid=a.aid
ORDER BY cruisingrange ASC;

DECLARE
    CURSOR pl_cur IS
        SELECT * FROM pilots
        ORDER BY cruisingrange ASC;

    pl_row pilots%ROWTYPE;
    is_assigned number;

BEGIN 
    DBMS_OUTPUT.PUT_LINE('hi from SP assign_pilot, param_flno = '||param_flno);

    --loop cursor through pilots
    FOR pl_row IN pl_cur LOOP
        --see if the range is long enough
        IF (pl_row.cruisingrange >= param_distance) THEN
            --see if pilot is available (not present in flight_assignments)
            SELECT COUNT(*)
            INTO is_assigned
            FROM flight_assignments FA
            WHERE FA.eid = pl_row.eid;

            --if pilot is available
            IF(is_assigned = 0) THEN
                --add fight to flight_assignments;
                INSERT INTO flight_assignments(flno, aid, eid)
                VALUES(param_flno, pl_cur.aid, pl_cur.eid);
                END;
            END IF;
        END IF;
    END LOOP;

    --if we reach this point, no one is available.
    --add flight to delayed_flights;
    INSERT INTO delayed_flights
    VALUES(param_flno);
END;
/
show errors;

【问题讨论】:

【参考方案1】:

原来你不能在存储过程中创建表,就是这样!

【讨论】:

【参考方案2】:

可以使用带有EXECUTE IMMEDIATE 的存储过程创建表 但是,DBA 必须提供明确的GRANT CREATE TABLE TO <user>

CREATE OR REPLACE PROCEDURE tobedeleted
IS
BEGIN
   EXECUTE IMMEDIATE 'CREATE TABLE TEST123 AS SELECT * FROM emp ';
...
...
...
END;

【讨论】:

以上是关于Oracle SQL - 无法创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle 在存储过程中用动态sql创建序列为何会遇到权限不足的问题呢?

oracle存储过程中update语句一直在执行中,无法更新完成

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

SQL的存储过程 语法格式是啥?