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

How can I get value of variable depend on another variable In 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;

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

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

db<>fiddle

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;

db<>fiddle here

您要求根据变量获得输出,但必须使用哪个变量取决于(其他)数据。这 可以 在 PL/SQL 中完成,即所谓的 "dynamic" 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 可以作为存储过程的参数,它不必像此处那样进行硬编码。 TABLE_0TABLE_1也是如此。