使用循环的SQL过程打印错误结果

时间:2018-10-09 18:19:19

标签: sql oracle loops stored-procedures plsql

我正在尝试编写一个简单的过程,该过程将表名和列作为参数,并仅打印结果。

这是我的代码:

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE TEST(TAB IN VARCHAR2, COLUMN IN VARCHAR2) IS
BEGIN
    FOR REC IN (SELECT COLUMN FROM TAB) LOOP
        DBMS_OUTPUT.PUT_LINE(REC.COLUMN);
    END LOOP;
END;
/

然后我用:

EXECUTE TEST('CLIENTS2', 'NOMCLI');

问题是这总是返回:

NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI
NOMCLI

我的表不是空的,当我直接尝试执行查询时,它可以很好地工作。 请问这是什么问题?谢谢!

1 个答案:

答案 0 :(得分:2)

过程输出正确。您的代码正在显式查询TAB视图(已过时但仍可用于向后兼容),名为COLUMN的参数是一个字符串常量,其值为'NOMCLI',因此查询将返回该常量TAB中每一行的值。

PL / SQL使用编译时提供的代码进行编译,并且不应用任何隐式的运行时替换,仅因为评估某些变量可以给出数据库对象的名称。我很确定这样的方法是行不通的。如果需要动态代码,则必须对其进行显式编码。

Read more about dynamic code in PL/SQL.