Вы можете передать значение с помощью параметра bind, если вы хотите использовать его в качестве литерального значения, и использовать конкатенацию строк, если вы хотите использовать его для динамической генерации имени столбца.
Так что, если ваши таблицы :
CREATE TABLE config1 ( acct_nbr, table_name ) AS
SELECT 'REGEXP_REPLACE(a.name,''/*/'')', 'abc' FROM DUAL;
CREATE TABLE stu ( name ) AS
SELECT 'as' FROM DUAL UNION ALL
SELECT 'bb' FROM DUAL UNION ALL
SELECT 'cc' FROM DUAL;
CREATE TABLE all_acc_num( code VARCHAR2(50), nbr_value VARCHAR2(20) );
Тогда ваш анонимный блок может передать литеральное значение с помощью EXECUTE IMMEDIATE ... USING ...
. Кроме того, если ваш идентификатор a.name
, вам также необходимо определить псевдоним a
:
DECLARE
vquery CLOB;
cursor c1 is
select * from config1;
BEGIN
FOR i IN c1 LOOP
vquery :='INSERT INTO all_acc_num(code,nbr_value)
select :1,'||i.acct_nbr||' from stu a';
DBMS_OUTPUT.PUT_LINE( vquery );
EXECUTE IMMEDIATE vquery USING i.acct_nbr;
END LOOP;
END;
/
, который выдает:
INSERT INTO all_acc_num(code,nbr_value)
select :1,REGEXP_REPLACE(a.name,'/*/') from stu a
и:
SELECT * FROM all_acc_num;
Выходы:
CODE | NBR_VALUE
:--------------------------- | :--------
REGEXP_REPLACE(a.name,'/*/') | as
REGEXP_REPLACE(a.name,'/*/') | bb
REGEXP_REPLACE(a.name,'/*/') | cc
дБ <> скрипка здесь