PL/SQL:作为变量的 FOR 循环的迭代器值不起作用
PL/SQL: iterator value from FOR loop as a variable not working
我不明白我的代码的行为。
为什么当我有
select min(i.column_name) into value_min from EMPLOYEES;
在我的代码中(见下文)我得到了错误,但是如果我把这个 palce 字符串与 table 的正确名称放在一起,我得到了结果
select min(SALARY) into value_min from EMPLOYEES;
declare
cursor c_column_name is select column_name, data_type from USER_TAB_COLUMNS where table_name = 'EMPLOYEES';
/***************************
(...)
SALARY NUMBER
(...)
***************************/
value_name_col varchar2(100);
value_min number;
value_max number;
value_result number;
type t_rekord is table of EMPLOYEES%ROWTYPE INDEX BY BINARY_INTEGER;
begin
for i IN c_column_name loop
--DBMS_OUTPUT.PUT_LINE(i.column_name);
if i.data_type = 'NUMBER' and i.column_name = 'SALARY' then
-- coment line get ERROR
-- select min(i.column_name) into value_min from EMPLOYEES;
-- select max(i.column_name) into value_max from EMPLOYEES;
-- code below get results
select min(SALARY) into value_min from EMPLOYEES;
select max(SALARY) into value_max from EMPLOYEES;
select round(dbms_random.value(value_min,value_max),2) into value_result from dual;
DBMS_OUTPUT.PUT_LINE(i.column_name || ' = ' || value_result);
end if;
end loop;
end;
我得到的错误:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 27
06502. 00000 - "PL/SQL: numeric or value error%s"
我准备这个是为了向您展示我的问题是怎样的,但我并不是这样做的。
如果您想使用变量指定 table 或列名,您需要动态 SQL(例如使用 execute immediate
),正如 Jeff Holt 评论的那样。
试试这个:
execute immediate 'select min(' || i.column_name
|| '), max(' || i.column_name
|| ') from EMPLOYEES' into value_min, value_max;
您收到“数字或值错误”,因为它正在执行 select min('SALARY')
然后它尝试将输出(字符串 'SALARY'
)保存到 value_min
,这是NUMBER 数据类型。
我不明白我的代码的行为。
为什么当我有
select min(i.column_name) into value_min from EMPLOYEES;
在我的代码中(见下文)我得到了错误,但是如果我把这个 palce 字符串与 table 的正确名称放在一起,我得到了结果
select min(SALARY) into value_min from EMPLOYEES;
declare
cursor c_column_name is select column_name, data_type from USER_TAB_COLUMNS where table_name = 'EMPLOYEES';
/***************************
(...)
SALARY NUMBER
(...)
***************************/
value_name_col varchar2(100);
value_min number;
value_max number;
value_result number;
type t_rekord is table of EMPLOYEES%ROWTYPE INDEX BY BINARY_INTEGER;
begin
for i IN c_column_name loop
--DBMS_OUTPUT.PUT_LINE(i.column_name);
if i.data_type = 'NUMBER' and i.column_name = 'SALARY' then
-- coment line get ERROR
-- select min(i.column_name) into value_min from EMPLOYEES;
-- select max(i.column_name) into value_max from EMPLOYEES;
-- code below get results
select min(SALARY) into value_min from EMPLOYEES;
select max(SALARY) into value_max from EMPLOYEES;
select round(dbms_random.value(value_min,value_max),2) into value_result from dual;
DBMS_OUTPUT.PUT_LINE(i.column_name || ' = ' || value_result);
end if;
end loop;
end;
我得到的错误:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 27
06502. 00000 - "PL/SQL: numeric or value error%s"
我准备这个是为了向您展示我的问题是怎样的,但我并不是这样做的。
如果您想使用变量指定 table 或列名,您需要动态 SQL(例如使用 execute immediate
),正如 Jeff Holt 评论的那样。
试试这个:
execute immediate 'select min(' || i.column_name
|| '), max(' || i.column_name
|| ') from EMPLOYEES' into value_min, value_max;
您收到“数字或值错误”,因为它正在执行 select min('SALARY')
然后它尝试将输出(字符串 'SALARY'
)保存到 value_min
,这是NUMBER 数据类型。