如何在Oracle sqlplus中遍历脚本传入的位置参数?
关于Oracle SQL*Plus遍历位置参数的解答
Oracle SQL*Plus 本身没有原生支持直接遍历所有传入位置参数的语法,你举例的for arg in &*写法无法直接运行,不过可以通过以下两种方案实现相同效果:
方案1:固定参数位循环取值
适合参数数量较小的场景,提前预留参数位即可,最多支持SQL*Plus默认的255个位置参数上限:
脚本script.sql内容
SET SERVEROUTPUT ON SET VERIFY OFF SET FEEDBACK OFF DECLARE v_arg VARCHAR2(4000); v_idx PLS_INTEGER := 1; BEGIN LOOP -- 匹配对应位置的参数,可根据实际需要扩展更多WHEN分支 CASE v_idx WHEN 1 THEN v_arg := '&1'; WHEN 2 THEN v_arg := '&2'; WHEN 3 THEN v_arg := '&3'; WHEN 4 THEN v_arg := '&4'; WHEN 5 THEN v_arg := '&5'; ELSE EXIT; END CASE; -- 取不到有效值则说明没有更多参数,退出循环 EXIT WHEN v_arg IS NULL OR v_arg = '&'||v_idx; DBMS_OUTPUT.PUT_LINE(v_arg); v_idx := v_idx + 1; END LOOP; END; / EXIT
调用方式
$ sqlplus user/passwd@sid @script.sql a b c
输出结果
a b c
方案2:拼接参数后拆分
适合参数数量多的场景,没有参数数量限制:
调用方式
将所有参数用引号包裹为一个整体传入:
$ sqlplus user/passwd@sid @script.sql "a b c d e f"
脚本script.sql内容
SET SERVEROUTPUT ON SET VERIFY OFF DECLARE v_all_args VARCHAR2(4000) := '&1'; v_split_pos PLS_INTEGER := 1; v_single_arg VARCHAR2(4000); BEGIN LOOP v_split_pos := INSTR(v_all_args, ' ', 1, 1); -- 处理最后一个无后续分隔符的参数 IF v_split_pos = 0 THEN v_single_arg := v_all_args; ELSE v_single_arg := SUBSTR(v_all_args, 1, v_split_pos - 1); v_all_args := SUBSTR(v_all_args, v_split_pos + 1); END IF; DBMS_OUTPUT.PUT_LINE(v_single_arg); EXIT WHEN v_split_pos = 0; END LOOP; END; / EXIT
注意:如果参数本身包含空格,可以将分隔符替换为参数中不会出现的特殊字符(比如
|、^等),避免拆分错误。
内容的提问来源于stack exchange,提问作者Olaf Dietsche
相关产品推荐
相关产品推荐

