You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
/

调用方式

  1. 执行前先开启服务器输出开关:
    SET SERVEROUTPUT ON;
  2. 调用示例:
    EXEC table_printer('SCOTT', 'EMP', 'ENAME');

注意事项

  • 存储过程执行用户需要拥有目标表的查询权限
  • 代码中默认将列值转换为字符串输出,最大支持4000字符长度,如需适配CLOB等大字段可自行调整变量类型
  • DBMS_ASSERT包的校验逻辑会自动过滤非法入参,避免SQL注入风险

内容的提问来源于stack exchange,提问作者SuperBlaze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:02