Как получить значение переменной в зависимости от другой переменной In Oracle 12 c? - PullRequest
0 голосов
/ 29 марта 2020

Ниже 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;

Ответы [ 3 ]

2 голосов
/ 29 марта 2020

Вы не можете использовать эти две скалярные переменные, но вы можете использовать коллекцию :

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 голосов
/ 29 марта 2020

Вы запрашиваете вывод в зависимости от переменной, но какая переменная должна использоваться, зависит от (других) данных. Это может быть выполнено в PL / SQL с помощью так называемого «динамика c» PL / SQL, как показано ниже. Обратите внимание, что Dynami c PL / SQL не на начальном уровне - это расширенный топи c.

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_0 и TABLE_1.

0 голосов
/ 29 марта 2020

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 здесь

...