Oracle PL/SQL 创建接收表所有者、表名、列名参数的打印存储过程
Oracle PL/SQL 动态打印指定列存储过程实现方案
你需要的功能可以通过动态SQL + 弱类型REF游标实现,以下是可直接使用的完整方案:
完整存储过程代码
CREATE OR REPLACE PROCEDURE table_printer( p_owner VARCHAR2, p_table_name VARCHAR2, p_column_name VARCHAR2 ) IS -- 定义弱类型动态游标 TYPE ref_cur IS REF CURSOR; v_cur ref_cur; v_column_value VARCHAR2(4000); v_dynamic_sql VARCHAR2(1000); BEGIN -- 入参加固,防止SQL注入,同时适配大小写敏感的对象名场景 v_dynamic_sql := 'SELECT "' || DBMS_ASSERT.SIMPLE_SQL_NAME(p_column_name) || '" FROM "' || DBMS_ASSERT.SCHEMA_NAME(p_owner) || '"."' || DBMS_ASSERT.SIMPLE_SQL_NAME(p_table_name) || '"'; -- 绑定动态SQL打开游标 OPEN v_cur FOR v_dynamic_sql; -- 循环遍历逐行打印 LOOP FETCH v_cur INTO v_column_value; EXIT WHEN v_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_column_value); END LOOP; -- 关闭游标释放资源 CLOSE v_cur; EXCEPTION WHEN OTHERS THEN -- 异常处理:游标未关闭则先关闭,再抛出错误提示 IF v_cur%ISOPEN THEN CLOSE v_cur; END IF; RAISE_APPLICATION_ERROR(-20001, '执行失败:' || SQLERRM); END; /
调用方式
- 执行前先开启服务器输出开关:
SET SERVEROUTPUT ON; - 调用示例:
EXEC table_printer('SCOTT', 'EMP', 'ENAME');
注意事项
- 存储过程执行用户需要拥有目标表的查询权限
- 代码中默认将列值转换为字符串输出,最大支持4000字符长度,如需适配CLOB等大字段可自行调整变量类型
DBMS_ASSERT包的校验逻辑会自动过滤非法入参,避免SQL注入风险
内容的提问来源于stack exchange,提问作者SuperBlaze
相关产品推荐
相关产品推荐

