Oracle存储过程报PLS-00103错误:遇符号IN不符合预期如何解决?
解决Oracle存储过程PLS-00103错误的方案
错误原因分析
触发PLS-00103错误是因为代码混用了非Oracle的语法规则,具体问题点如下:
- Oracle存储过程的参数模式(
IN/OUT/IN OUT)需放在参数类型之后,而非参数名前;且默认参数模式就是IN,可省略。 - Oracle不支持
VARCHAR类型,需用VARCHAR2替代。 - 变量声明块
DECLARE必须放在BEGIN语句之前(Oracle中用IS或AS替代DECLARE作为声明块起始)。 - Oracle没有
INT数据类型,需用NUMBER定义整数变量。 - Oracle字符串长度函数为
LENGTH(),而非CHAR_LENGTH()。 - 存储过程中不能直接执行
SELECT返回结果,需通过输出参数或DBMS_OUTPUT输出内容。
修正后的存储过程代码
方案1:使用输出参数返回结果
CREATE OR REPLACE PROCEDURE print_string( input_string IN VARCHAR2(255), out_upper_str OUT VARCHAR2(255), out_char_count OUT NUMBER ) IS num_chars NUMBER DEFAULT 0; BEGIN IF input_string IS NULL THEN num_chars := 0; out_upper_str := NULL; ELSE num_chars := LENGTH(input_string); out_upper_str := UPPER(input_string); END IF; out_char_count := num_chars; END; /
方案2:使用DBMS_OUTPUT直接打印结果(适合调试)
CREATE OR REPLACE PROCEDURE print_string( input_string IN VARCHAR2(255) ) IS num_chars NUMBER DEFAULT 0; upper_str VARCHAR2(255); BEGIN IF input_string IS NULL THEN num_chars := 0; upper_str := NULL; ELSE num_chars := LENGTH(input_string); upper_str := UPPER(input_string); END IF; DBMS_OUTPUT.PUT_LINE('大写字符串: ' || NVL(upper_str, 'NULL')); DBMS_OUTPUT.PUT_LINE('字符长度: ' || num_chars); END; /
执行说明
- 方案1的存储过程需通过绑定输出参数调用,示例PL/SQL块:
DECLARE v_upper VARCHAR2(255); v_count NUMBER; BEGIN print_string('hello world', v_upper, v_count); DBMS_OUTPUT.PUT_LINE('结果:' || v_upper || ',长度:' || v_count); END; /
- 方案2的存储过程调用前需开启
DBMS_OUTPUT:
SET SERVEROUTPUT ON; EXEC print_string('hello world');
内容的提问来源于stack exchange,提问作者abid zuby
相关产品推荐
相关产品推荐

