如何获取依赖于Oracle 12c中另一个变量的变量值



在下面的PL/SQL中,输出结果是'TABLE_1',但我需要得到这个变量的值,它是'WIN',而不是打印变量的名称。如何应用它?

DECLARE
TABLE_0 VARCHAR2(10) DEFAULT 'LOSE';
TABLE_1 VARCHAR2(10) DEFAULT 'WIN';
GUESS   VARCHAR2(10);
X       NUMBER;
BEGIN
X := 1;
GUESS := 'TABLE_'||X;
DBMS_OUTPUT.put_line(GUESS);
END;

你不能使用这两个标量变量,但你可以使用一个集合:

DECLARE
TYPE T_RESULTS IS TABLE OF VARCHAR2(4) INDEX BY PLS_INTEGER;
RESULTS T_RESULTS := T_RESULTS();
X NUMBER;
BEGIN
RESULTS(1) := 'LOSE';
RESULTS(2) := 'WIN';
X := 1;
DBMS_OUTPUT.put_line(X || ': ' || RESULTS(X));
FOR I IN 1..5 LOOP
X := CEIL(DBMS_RANDOM.VALUE(0, 2));
DBMS_OUTPUT.put_line(X || ': ' || RESULTS(X));
END LOOP;
END;
/
1: LOSE
2: WIN
2: WIN
1: LOSE
1: LOSE
2: WIN

数据库<>小提琴

您要求根据变量获得输出,但必须使用哪个变量取决于(其他(数据。这可以在PL/SQL中完成,即所谓的"动态"PL/SQL,如下所示。请注意,动态PL/SQL不是初学者级别的,它是一个高级主题。

DECLARE
TABLE_0 VARCHAR2(10) DEFAULT 'LOSE';
TABLE_1 VARCHAR2(10) DEFAULT 'WIN' ;
X       NUMBER;
GUESS   VARCHAR2(1000);   -- or CLOB for more generality
BEGIN
X := 1;
GUESS := ' DECLARE
TABLE_0 VARCHAR2(10) := :TABLE_0;
TABLE_1 VARCHAR2(10) := :TABLE_1;
BEGIN
DBMS_OUTPUT.PUT_LINE(TABLE_' || X || ');
END;';
EXECUTE IMMEDIATE GUESS USING TABLE_0, TABLE_1;
END;
/

当我运行此代码时,我得到以下响应(确保我首先设置了serveroutput,这样我就可以看到PUT_LINE的输出(:

WIN

PL/SQL procedure successfully completed.

注意,X可以是存储过程的参数,它不必像这里那样进行硬编码。CCD_ 2和CCD_ 3也是如此。

PL/SQL不提供元编程功能,无法根据变量的名称查询变量的值-到程序执行时,程序本身无法访问变量的名称@AlexPoole展示了一种在这些约束条件下工作的方法。另一种方法是使用一组字符串,其中的索引也是字符串:

DECLARE
TYPE tCol_string_idx_string IS
TABLE OF VARCHAR2(10)
INDEX BY VARCHAR2(10);
colGuesses  tCol_string_idx_string;
X           NUMBER;
GUESS       VARCHAR2(10);
BEGIN
colGuesses('TABLE_1') := 'LOSE';
colGuesses('TABLE_2') := 'WIN';
X := 1;
GUESS:= 'TABLE_' || X;
DBMS_OUTPUT.PUT_LINE('X=' || X || 
'  GUESS=''' || GUESS || '''' ||
'  result=''' || colGuesses(GUESS) || '''');
X := 2;
GUESS:= 'TABLE_' || X;
DBMS_OUTPUT.PUT_LINE('X=' || X || 
'  GUESS=''' || GUESS || '''' ||
'  result=''' || colGuesses(GUESS) || '''');
END;

数据库<>在这里摆弄

相关内容

最新更新