如何根据Oracle 12c中的另一个变量获取变量的值?

如何根据Oracle 12c中的另一个变量获取变量的值?,oracle,plsql,oracle12c,Oracle,Plsql,Oracle12c,在下面的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(GUE

在下面的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;

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


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


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;

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;

您要求根据变量获取输出,但必须使用哪个变量取决于(其他)数据。这可以在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设置为on,这样我就可以看到PUT_行的输出):


请注意,
X
可以是存储过程的参数,它不必像这里那样硬编码。这同样适用于
表0
表1
您要求根据变量获取输出,但必须使用哪个变量取决于(其他)数据。这可以在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设置为on,这样我就可以看到PUT_行的输出):


请注意,
X
可以是存储过程的参数,它不必像这里那样硬编码。同样的情况也适用于
表0
表1

@psaraj12-不确定你的意思-在问题中进行查找的变量是一个数字,而不是一个字符串?明白了,在这种情况下,我们可以使用结果(0):='LOSE'和结果(1):='WIN'然后是运算结果(猜测)或结果(X)将给出正确的答案answer@psaraj12-不确定您的意思-问题中用于查找的变量是数字,而不是字符串?明白了,在这种情况下,我们可以使用结果(0):='LOSE'和结果(1):='WIN',然后是运算结果(猜测)或结果(X)将给出正确答案PL/SQL确实提供了上述元编程功能-我刚才在回答中说明了这一点。PL/SQL确实提供了上述元编程功能-我刚才在回答中说明了这一点。