在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
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完成此[[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_0
和TABLE_1
也是如此。