如何获得变量的值取决于Oracle 12c中的另一个变量?

问题描述 投票:0回答:3

在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
3个回答
2
投票

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


0
投票

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


0
投票

您要根据变量获取输出,但是必须使用哪个变量取决于(其他)数据。可以使用称为“动态” PL / SQL的PL / SQL完成此[[can,如下所示。请注意,动态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也是如此。
© www.soinside.com 2019 - 2024. All rights reserved.