【问题标题】:How can I get value of variable depend on another variable In Oracle 12c?如何获取变量的值取决于 Oracle 12c 中的另一个变量?
【发布时间】:2020-03-29 12:57:54
【问题描述】:

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

【问题讨论】:

    标签: oracle plsql oracle12c


    【解决方案1】:

    你不能使用这两个标量变量,但你可以使用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

    【讨论】:

    • @psaraj12 - 不确定你的意思 - 在问题中进行查找的变量是数字,而不是字符串?
    • 知道了,在这种情况下我们可以使用 Result(0):='LOSE' 和 Result(1):='WIN' 然后 OP RESULT(GUESS) 或 Result(X) 会给出正确的回答
    【解决方案2】:

    您要求根据变量获得输出,但必须使用哪个变量取决于(其他)数据。这可以在 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 可以是存储过程的参数,它不必像这里那样硬编码。 TABLE_0TABLE_1 也是如此。

    【讨论】:

      【解决方案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;
      

      db<>fiddle here

      【讨论】:

      • PL/SQL 确实提供了上述元编程功能——我刚刚在我的回答中展示了这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2021-08-22
      • 1970-01-01
      • 2016-03-21
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多