dynamic SQL
Is Hi possible to create dynamic sql statements to create a select statement
for example I have table with 50 lines, I need to contract a statemnt for all columns selection how can I do this Dynamics
Hi Alex,
Start with something like this
select 'select ' || LISTAGG(column_name, ', ') within GROUP (ORDER BY COLUMN_ID ) || ' from ' || table_name || ';' as "-- select statement" from user_tab_columns where table_name like upper ( '&1' ) group by table_name;
concerning
Kay
Tags: Database
Similar Questions
-
Difference between static &; dynamic sql
Hello
It is my first question in OTN.
I have a pl/sql procedure with no insert statements.
Insert into table values...
If I turn all these insert statements in dynamic sql, my procedure will give more effective? (execution)
Please help me.
Thanks in adv
Friend
Hello
8b00c42d-7716-467e-BCEF-c756fd9599e2 wrote:
Hello
It is my first question in OTN.
Welcome to the Forum!
To get the most out of this Forum, see the FAQ in the Forum: Re: 2. How can I ask a question on the forums?
For all performance issues, see also this Forum FAQ page: Re: 3. how to improve the performance of my query? / my query is slow.
I have a pl/sql procedure with no insert statements.
Insert into table values...
If I turn all these insert statements in dynamic sql, my procedure will give more effective? (execution)
Probably not. Dynamic SQL is generally less effective than static SQL, as well as being more difficult to code, debug and maintain.
Is there a reason why you think that the dynamic SQL would be preferable in this case? If so, what is it?
-
A loop dynamic sql in the procedure
Hi guys,.
I'm having a procedure that will have two input start_date and end_date parameters
I need a loop in alter procedure statement something like this using dynamic sql
CHANGE TABLE M1
SWAP PARTITION FOR (TO_DATE('01-JAN-2015','dd-MON-yyyy'))
WITH TABLE T2
INCLUDING THE INDEX;
CHANGE TABLE M1
BY EXCHANGE COMPETITION FOR (TO_DATE('02-JAN-2015','dd-MON-yyyy'))
WITH TABLE T3
INCLUDING THE INDEX;
.
.
.
For example I have dates in setting something like January 1, 2015-4 January 2015
I need something like this, where T is a constant variable, I need to add T1, T2. T3 according to the dates of the range.
Hello
your procedure can not simply be rolled up, but the call session can be rolled up the output to a file.
Try something like this
col act_date noprint new_value act_date SET TERMOUT OFF select to_char(sysdate, 'yyyy_mm_dd_hh24miss') act_date from dual; SET TERMOUT ON set serveroutput on set feedback off set linesize 3000 col statement for a200 heading "-- alter statements" spool d:\temp\&act_date._&_CONNECT_IDENTIFIER._alter_partition.sql -- exec your_procedure -- or simple plain sql with data (start_date, end_date) as ( select to_date('01/01/2016', 'dd/mm/yyyy'), to_date('05/01/2016', 'dd/mm/yyyy') from dual ) select --level, to_char(start_date + (level - 1), 'dd-MON-yyyy' ) cur_date 'ALTER TABLE M1 EXCHANGE PARTITION FOR (TO_DATE(''' || to_char(start_date + (level - 1), 'dd-MON-yyyy' ) || ''',''dd-MON-yyyy'')) WITH TABLE T2 INCLUDING INDEXES;' || chr(10) || 'ALTER TABLE M1 EXCHANGE PARTITION FOR (TO_DATE(''' || to_char(start_date + (level - 1), 'dd-MON-yyyy' ) || ''',''dd-MON-yyyy'')) WITH TABLE T3 INCLUDING INDEXES;' as statement from data connect by level <= end_date - start_date + 1; spool off set feedback on prompt @d:\temp\mk_alter.sql
concerning
Kay -
Error when using native dynamic SQL
Please can someone help me understand what's wrong with my code.
Code:
create or replace procedure p1 (name varchar2)
as
Start
run immediately "select * from ' |" name;
end;
/
Goal: Just to test the native dynamic SQL code using a placeholder.
COmpliation:
SQL > create or replace procedure p1 (name varchar2)
2 as
3
4 start
5 run immediately "select * from ' |" name;
6 end;
7.
Created procedure.
Error:
SQL > exec p1 ('employees');
BEGIN p1 ('employees'); END;
*
ERROR on line 1:
ORA-00923: THE KEYWORD not found where expected
ORA-06512: at "HR. "P1", line 5
ORA-06512: at line 1
SQL >
You need a space after the clause 'from', like this:
run immediately "select * from ' |" name;
-
How to pass the Record of entry to the dynamic SQL Code
Hi all
I am trying to run under Oracle applications API on the remote database using DB Link. I try to run using dynamic SQL. Part of the code is given below.
DECLARE
l_batch_info_rec wsh_picking_batches_pub.batch_info_rec;
l_rule_id NUMBER;
l_rule_name VARCHAR2 (240);
l_batch_prefix VARCHAR2 (240);
BEGIN
l_batch_info_rec.document_set_id: = v_document_set_id;
l_batch_info_rec.order_type_id: = v_order_type_id;
l_batch_info_rec. Default_Stage_Subinventory: = v_default_stage_subinventory;
l_batch_info_rec.pick_grouping_rule_id: = v_pick_grouping_rule_id;
l_batch_info_rec.pick_sequence_rule_id: = v_pick_sequence_rule_id;
l_batch_info_rec.autopack_level: = v_autopack_level;
l_batch_info_rec.autopack_flag: = v_autopack_flag;
l_batch_info_rec.ac_delivery_criteria: = v_ac_delivery_criteria;
l_batch_info_rec.backorders_only_flag: = v_backorders_only_flag;
l_batch_info_rec.existing_rsvs_only_flag: = v_existing_rsvs_only_flag;
l_batch_info_rec.customer_id: = v_customer_id;
l_batch_info_rec.order_header_id: = v_header_id;
l_batch_info_rec.from_scheduled_ship_date: = NULL;
l_batch_info_rec.organization_id: = v_organization_id;
l_batch_info_rec.include_planned_lines: = v_include_planned_lines;
l_batch_info_rec.autocreate_delivery_flag: = v_autocreate_deliveries_flag;
l_batch_info_rec.autodetail_pr_flag: = v_autodetail_pr_flag;
l_batch_info_rec.allocation_method: = 'I ';
l_batch_info_rec.pick_from_locator_id: = NULL;
l_batch_info_rec.auto_pick_confirm_flag: = 'n'; -The value manually to run Transact order
l_batch_info_rec.autopack_flag: = 'n'; -Manually configure to perform the manual packaging
l_rule_id: = NULL;
l_rule_name: = NULL;
l_batch_prefix: = NULL;
v_sqlstmt1: = ' START
wsh_picking_batches_pub.create_batch' | g_db_link | "(1.0,
fnd_api.g_true,
fnd_api.g_true,
: l_return_status,.
: l_msg_count,.
: l_msg_data,.
: l_rule_id,.
: l_rule_name,.
: l_batch_info_rec,.
: l_batch_prefix,.
: p_new_batch_id
);
END;';
--
EXECUTE IMMEDIATE V_sqlstmt1
With the HELP OF THE l_return_status,.
ON l_msg_count,.
ON l_msg_data,.
BY l_rule_id,
BY l_rule_name,
BY l_batch_info_rec,
BY l_batch_prefix,
OUT p_new_batch_id;
--
END;
After you run this script, I get below error "PLS-00457: expressions must be SQL types ' for variable l_batch_info_rec which is of type record. can someone please guide me how can I pass variable type dynamic SQL record.
Thank you
Priyanka
Food for thought:
On remote db:
SQL > create or replace
package 2 pkg
3 is
4 type r_type is (record
Number 5,
6 name varchar2 (10)
7 );
(p) 8 procedure
9 p_rec in r_type,
10 p_out out varchar2
11 );
12 end;
13.Package created.
SQL > create or replace
package 2 body pkg
3 is
4 procedure p)
5 p_rec in r_type,
6 p_out out varchar2
7 )
8 is
9 start
10 p_out: = "ID = ' |" p_rec.ID | 'Name =' | p_rec. Name;
11 end;
12 end;
13.Package body created.
SQL >
On local db:
SQL > set serveroutput on
SQL > declare
v_rec 2 pkg.r_type@pdb1sol12;
3 v_out varchar2 (50);
4 start
v_rec.ID 5: = 1;
6 v_rec.name: = 'XXX ';
7 immediate execution"
8 begin
9 pkg.p@pdb1sol12 (: 1,: 2);
10 end;'
11 using v_rec,
12 v_out;
13 dbms_output.put_line (v_out);
14 end;
15.
using v_rec;
*
ERROR on line 11:
ORA-06550: line 11, column 20:
PLS-00457: expressions must be SQL types
ORA-06550: line 7, column 5:
PL/SQL: Statement ignoredSQL > declare
2 number of v_id: = 1;
3 v_name varchar2 (10): = 'XXX ';
4 v_out varchar2 (50);
5. start
6 immediate execution"
7 report
8 v_rec pkg.r_type@pdb1sol12.
9 begin
10 v_rec.id := :1;
11 v_rec.name: =: 2;
12 pkg.p@pdb1sol12 (v_rec,: 3);
13 end;'
14 using v_id,
15 in v_name,
16 v_out;
17 dbms_output.put_line (v_out);
18 end;
19.
ID = 1 name = XXXPL/SQL procedure successfully completed.
SQL >
SY.
-
How the date can be filled with timestamp in dynamic sql
Hi all
Below we have sql
v_stmt: = ' MERGE IN MTH_EQUIPMENTS_EXT_B ED
WITH THE HELP OF)
SELECT TAG_DATA,
EQUIPMENT_FK_KEY,
WORKORDER_FK_KEY,
SEGMENT_FK_KEY,
SHIFT_WORKDAY_FK_KEY,
HOUR_FK_KEY,
ITEM_FK_KEY,
READ_TIME,
ATTR_GROUP_ID,
RECIPE_NUM,
RECIPE_VERSION,
NVL (FND_GLOBAL. User_Id,-1) l_updated_by,.
NVL (FND_GLOBAL. Login_Id,-1) l_last_update_login
OF MTH_TAG_READINGS_T_STG
WHERE DB_COL = ' | " ' || v_colname | " ' ||') TS
WE (';)
v_stmt: = v_stmt | "ED. EQUIPMENT_PK_KEY = TS. EQUIPMENT_FK_KEY AND
ED. READ_TIME = TS. READ_TIME AND
ED. ATTR_GROUP_ID = TS. ATTR_GROUP_ID)
WHEN MATCHED THEN
UPDATE
GAME ED.'. v_colname |' = TS. TAG_DATA,
ED. LAST_UPDATED_BY = 1, ";
v_stmt: = v_stmt | "ED. LAST_UPDATE_LOGIN = TS.l_last_update_login
WHEN NOT MATCHED THEN
INSERT ('| v_colname |', EXTENSION_ID, EQUIPMENT_PK_KEY, WORKORDER_FK_KEY, SEGMENT_FK_KEY, SHIFT_WORKDAY_FK_KEY, HOUR_FK_KEY, ITEM_FK_KEY, READ_TIME, ATTR_GROUP_ID, LAST_UPDATE_DATE, LAST_UPDATED_BY,';)
v_stmt: =.
v_stmt | ("LAST_UPDATE_LOGIN, CREATED_BY, CREATION_DATE, RECIPE_NUM, RECIPE_VERSION)
VALUES (TS. TAG_DATA, EGO_EXTFWK_S.NEXTVAL, TS. EQUIPMENT_FK_KEY, TS. WORKORDER_FK_KEY, TS. SEGMENT_FK_KEY, TS. SHIFT_WORKDAY_FK_KEY, TS. HOUR_FK_KEY, TS. ITEM_FK_KEY, TS. READ_TIME,';
v_stmt: = v_stmt | "TS. ATTR_GROUP_ID,' | '''|| SYSDATE | "'| ', 1, TS.l_last_update_login, TS.l_updated_by,'|"' | SYSDATE | " ' ||', TS. RECIPE_NUM, TS. RECIPE_VERSION)';
EXECUTE IMMEDIATE v_stmt;
After you run the above SQL last date of update in MTH_EQUIPMENST_EXT_B is filled with sysdate but timestamp is not its always 00:00:00. Can we have timestamp also populated through dynamic sql in the last update date
Kind regards
Amrit
Values to hardcode in the dynamic SQL - never use bind variables:
v_stmt: = ' MERGE IN MTH_EQUIPMENTS_EXT_B ED
WITH THE HELP OF)
SELECT TAG_DATA,
EQUIPMENT_FK_KEY,
WORKORDER_FK_KEY,
SEGMENT_FK_KEY,
SHIFT_WORKDAY_FK_KEY,
HOUR_FK_KEY,
ITEM_FK_KEY,
READ_TIME,
ATTR_GROUP_ID,
RECIPE_NUM,
RECIPE_VERSION,
NVL (FND_GLOBAL. User_Id,-1) l_updated_by,.
NVL (FND_GLOBAL. Login_Id,-1) l_last_update_login
OF MTH_TAG_READINGS_T_STG
WHERE DB_COL =: 1) TS
WE (';)
v_stmt: = v_stmt | "ED. EQUIPMENT_PK_KEY = TS. EQUIPMENT_FK_KEY AND
ED. READ_TIME = TS. READ_TIME AND
ED. ATTR_GROUP_ID = TS. ATTR_GROUP_ID)
WHEN MATCHED THEN
UPDATE
GAME ED.'. v_colname |' = TS. TAG_DATA,
ED. LAST_UPDATED_BY = 1, ";
v_stmt: = v_stmt | "ED. LAST_UPDATE_LOGIN = TS.l_last_update_login
WHEN NOT MATCHED THEN
INSERT ('| v_colname |', EXTENSION_ID, EQUIPMENT_PK_KEY, WORKORDER_FK_KEY, SEGMENT_FK_KEY, SHIFT_WORKDAY_FK_KEY, HOUR_FK_KEY, ITEM_FK_KEY, READ_TIME, ATTR_GROUP_ID, LAST_UPDATE_DATE, LAST_UPDATED_BY,';)
v_stmt: =.
v_stmt | ("LAST_UPDATE_LOGIN, CREATED_BY, CREATION_DATE, RECIPE_NUM, RECIPE_VERSION)
VALUES (TS. TAG_DATA, EGO_EXTFWK_S.NEXTVAL, TS. EQUIPMENT_FK_KEY, TS. WORKORDER_FK_KEY, TS. SEGMENT_FK_KEY, TS. SHIFT_WORKDAY_FK_KEY, TS. HOUR_FK_KEY, TS. ITEM_FK_KEY, TS. READ_TIME,';
v_stmt: = v_stmt | "TS. ATTR_GROUP_ID,: 2, 1, TS.l_last_update_login, TS.l_updated_by,: 3, TS. RECIPE_NUM, TS. RECIPE_VERSION)';
V_stmt EXECUTE IMMEDIATE
With the HELP of v_colname,.
SYSDATE,
SYSDATE;
SY.
-
How to extract the names of columns in dynamic SQL
Hi all
Is it possible to extract all the names of columns in a dynamic query?
In my case according to the user selections that my query will get changed (number of the column, column name and tables that everything can vary).
So now, is it possible to retrieve all the column names of the dynamic query generated?
I am using Oracle 11g (11.2.0.4)
Thank you
Shaz
-
How to get sql % number of dynamic sql code lines
Hello
In this procedure I'm inserting and updating using dynamic sql. Now I want to go back two more PARAMETERS, the parameter should be back the number of lines inserted and how updated by stmtas of UPDATE as well as an INSERT. I'm not able to do can help you on that?
CREATE OR REPLACE PROCEDURE Sp_Array_Test( PV_TGT_NAME IN VARCHAR2, PV_SRC_NAME IN VARCHAR2, PV_PK_COLS IN VARCHAR2, PN_ERR_CD OUT NUMBER, PN_ERR_MSG OUT VARCHAR2) AS TYPE ARR_TAB IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER; --UTL_FP UTL_FILE.FILE_TYPE; LV_AN_ BLOCK VARCHAR2(32767); LN_CUR BINARY_INTEGER := DBMS_SQL.OPEN_CURSOR; LN_DESC DBMS_SQL.DESC_TAB; LN_COL_CNT PLS_INTEGER := 0; LV_SEL_UPD_STMT VARCHAR2(4000); LV_SEL_INS_STMT VARCHAR2(4000); ARR_INDX NUMBER := 1; LV_DATA_TYPE VARCHAR2(8); LN_FIND_FLAG NUMBER := 0; LN_TAB ARR_TAB; LV_COLS_ARR ARR_TAB; LV_ERR_MSG VARCHAR2(500); --PROCEDURE FILE_WRITE ( FH_IN IN UTL_FILE.FILE_TYPE, -- STRING_IN IN VARCHAR2 ) IS --BEGIN -- UTL_FILE.PUT_LINE(FH_IN,STRING_IN); -- LV_AN_BLOCK := LV_AN_BLOCK||STRING_IN; --EXCEPTION -- WHEN OTHERS THEN -- RAISE; --END FILE_WRITE; BEGIN -- UTL_FP := UTL_FILE.FOPEN('TEST_DIR', 'TEST.sql', 'W'); LV_SEL_UPD_STMT := 'SELECT A.'||REPLACE(PV_PK_COLS,',','||A.')||' PK_COLS , A.* , B.ROWID FROM '||PV_SRC_NAME||' A, '||PV_TGT_NAME||' B WHERE '; LV_SEL_INS_STMT := 'SELECT A.* FROM '||PV_SRC_NAME||' A WHERE NOT EXISTS (SELECT ''1'' FROM '||PV_TGT_NAME||' B WHERE '; LN_TAB(ARR_INDX) := 'DECLARE '; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := 'CURSOR CUR_VIEW_UPD IS '||LV_SEL_UPD_STMT ; ARR_INDX := ARR_INDX + 1; SELECT SUBSTR(COLS,DECODE(RN,1,1,INSTR(COLS,',',1,RN-1)+1),DECODE(RN,1,INSTR(COLS,',',1,RN)-1,INSTR(COLS,',',1,RN)-INSTR(COLS,',',1,RN-1)-1)) BULK COLLECT INTO LV_COLS_ARR FROM ( SELECT RN, PV_PK_COLS||',' COLS FROM (SELECT ROWNUM RN FROM ALL_OBJECTS WHERE ROWNUM <= LENGTH(PV_PK_COLS)- LENGTH(REPLACE(PV_PK_COLS,','))+1)) ; FOR K IN 1 .. LV_COLS_ARR.COUNT LOOP LV_SEL_UPD_STMT := LV_SEL_UPD_STMT||' A.'||LV_COLS_ARR(K)||' = '; LN_TAB(ARR_INDX) := ' A.'||LV_COLS_ARR(K)||' = '; LV_SEL_UPD_STMT := LV_SEL_UPD_STMT||' B.'||LV_COLS_ARR(K) ||CASE WHEN K = LV_COLS_ARR.COUNT THEN NULL ELSE ' AND ' END; LN_TAB(ARR_INDX) := LN_TAB(ARR_INDX)||' B.'||LV_COLS_ARR(K) ||CASE WHEN K = LV_COLS_ARR.COUNT THEN ' ;' ELSE ' AND ' END; ARR_INDX := ARR_INDX + 1; END LOOP; LN_TAB(ARR_INDX) := 'CURSOR CUR_VIEW_INS IS '||LV_SEL_INS_STMT ; ARR_INDX := ARR_INDX + 1; FOR K IN 1 .. LV_COLS_ARR.COUNT LOOP LV_SEL_INS_STMT := LV_SEL_INS_STMT||' A.'||LV_COLS_ARR(K)||' = '; LN_TAB(ARR_INDX) := ' A.'||LV_COLS_ARR(K)||' = '; LV_SEL_INS_STMT := LV_SEL_INS_STMT||' B.'||LV_COLS_ARR(K) ||CASE WHEN K = LV_COLS_ARR.COUNT THEN NULL ELSE ' AND ' END; LN_TAB(ARR_INDX) := LN_TAB(ARR_INDX)||' B.'||LV_COLS_ARR(K) ||CASE WHEN K = LV_COLS_ARR.COUNT THEN ' );' ELSE ' AND ' END; ARR_INDX := ARR_INDX + 1; END LOOP; LV_ERR_MSG := 'WHILE PARSING SELECT STATEMENT -- '||LV_SEL_UPD_STMT; DBMS_SQL.PARSE(LN_CUR, LV_SEL_UPD_STMT, DBMS_SQL.NATIVE); LV_ERR_MSG := 'WHILE DESCRIBING SELECT STATEMENT -- '||LV_SEL_UPD_STMT; DBMS_SQL.DESCRIBE_COLUMNS(LN_CUR, LN_COL_CNT, LN_DESC); FOR i IN LN_DESC.FIRST .. LN_DESC.LAST LOOP IF LN_DESC(i).col_type = 2 THEN LV_DATA_TYPE := 'NUMBER'; ELSIF LN_DESC(i).col_type = 12 THEN LV_DATA_TYPE := 'DATE'; ELSE LV_DATA_TYPE := 'VARCHAR2'; END IF; LN_TAB(ARR_INDX) := ' T_'||LN_DESC(i).col_name||' DBMS_SQL.'||LV_DATA_TYPE||'_TABLE;'; ARR_INDX := ARR_INDX + 1; END LOOP; LN_TAB(ARR_INDX) := 'BEGIN '; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' EXECUTE IMMEDIATE ''ALTER SESSION SET NLS_DATE_FORMAT = ''''DD-MON-YYYY HH24:MI:SS'''''';'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' OPEN CUR_VIEW_UPD;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' LOOP'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' FETCH CUR_VIEW_UPD BULK COLLECT INTO T_'||LN_DESC(LN_DESC.FIRST).col_name||','; ARR_INDX := ARR_INDX + 1; FOR i IN LN_DESC.FIRST + 1 .. LN_DESC.LAST - 1 LOOP LN_TAB(ARR_INDX) := ' T_'||LN_DESC(i).col_name||','; ARR_INDX := ARR_INDX + 1; END LOOP; LN_TAB(ARR_INDX) := ' T_'||LN_DESC(LN_DESC.LAST).col_name||' LIMIT 500 ;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' FORALL I IN 1 .. '||'T_'||LN_DESC(LN_DESC.LAST).col_name||'.COUNT '; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' UPDATE '||PV_TGT_NAME||' SET '; ARR_INDX := ARR_INDX + 1; LN_FIND_FLAG := 0; FOR I IN LN_DESC.FIRST + 1 .. LN_DESC.LAST-1 LOOP FOR K IN 1 .. LV_COLS_ARR.COUNT LOOP LN_FIND_FLAG := 0; IF LN_DESC(I).COL_NAME = LV_COLS_ARR(K) THEN LN_FIND_FLAG := 1; EXIT; END IF; END LOOP; IF LN_FIND_FLAG = 0 THEN LN_TAB(ARR_INDX) := ' '||LN_DESC(i).col_name||' = '||'T_'||LN_DESC(i).col_name||'(I)'||CASE WHEN I = LN_DESC.LAST-1 THEN ' WHERE ' ELSE ',' END; ARR_INDX := ARR_INDX + 1; END IF ; END LOOP; LN_TAB(ARR_INDX) := ' ROWID = '||'T_'||LN_DESC(LN_DESC.LAST).col_name||'(I) ;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' COMMIT;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' EXIT WHEN CUR_VIEW_UPD%NOTFOUND;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' END LOOP;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' CLOSE CUR_VIEW_UPD;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' COMMIT;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' OPEN CUR_VIEW_INS;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' LOOP'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' FETCH CUR_VIEW_INS BULK COLLECT INTO T_'||LN_DESC(LN_DESC.FIRST+1).col_name||','; ARR_INDX := ARR_INDX + 1; FOR i IN LN_DESC.FIRST + 2 .. LN_DESC.LAST - 2 LOOP LN_TAB(ARR_INDX) := ' T_'||LN_DESC(i).col_name||','; ARR_INDX := ARR_INDX + 1; END LOOP; LN_TAB(ARR_INDX) := ' T_'||LN_DESC(LN_DESC.LAST-1).col_name||' LIMIT 500 ;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' FORALL J IN 1 .. '||'T_'||LN_DESC(LN_DESC.FIRST + 1).col_name||'.COUNT '; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' INSERT INTO '||PV_TGT_NAME||' ('; ARR_INDX := ARR_INDX + 1; FOR i IN LN_DESC.FIRST + 1 .. LN_DESC.LAST - 1 LOOP LN_TAB(ARR_INDX) := ' '||LN_DESC(i).col_name||CASE WHEN I = LN_DESC.LAST - 1 THEN ' )' ELSE ',' END ; ARR_INDX := ARR_INDX + 1; END LOOP; FOR i IN LN_DESC.FIRST + 1 .. LN_DESC.LAST - 1 LOOP LN_TAB(ARR_INDX) := CASE WHEN I = LN_DESC.FIRST + 1 THEN 'VALUES (' ELSE NULL END ||' T_'||LN_DESC(i).col_name||'(J)'||CASE WHEN I = LN_DESC.LAST - 1 THEN ' ) ;' ELSE ',' END ; ARR_INDX := ARR_INDX + 1; END LOOP; LN_TAB(ARR_INDX) := ' COMMIT;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' EXIT WHEN CUR_VIEW_INS%NOTFOUND;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' END LOOP;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' CLOSE CUR_VIEW_INS;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := ' COMMIT;'; ARR_INDX := ARR_INDX + 1; LN_TAB(ARR_INDX) := 'END ;'; ARR_INDX := ARR_INDX + 1; FOR J IN 1 .. LN_TAB.COUNT LOOP -- DBMS_OUTPUT.PUT_LINE( LN_TAB(J)); -- FILE_WRITE(UTL_FP,LN_TAB(J)); LV_AN_BLOCK := LV_AN_BLOCK||LN_TAB(J); END LOOP; -- UTL_FILE.FCLOSE(UTL_FP); EXECUTE IMMEDIATE LV_AN_BLOCK; PN_ERR_CD := 0; PN_ERR_MSG := 'Successful Completion'; EXCEPTION WHEN OTHERS THEN PN_ERR_CD := SQLCODE; PN_ERR_MSG := LV_ERR_MSG||' -- '||SQLERRM ; END; /
Thank you all for your answers. I agree with you all. I have manged this time by adding variable bind, then run it immediately ON aid. I don't know how it's going to be training.
From now on my side no problem I don't thank you.
-
How to write the SQL without using dynamic SQL?
How can you write this under SQL without using execute immediately?
You can use static SQL (using something like a CASE statement)?
test procedure (one in varchar2, b number, each number) is
v_num_recs pls_integer;
Start
Select count (*)
in v_num
FROM table1
where
col1 = one and
If b is not null then col2 = b
If c is not null then col3 = c;
/ * i.e. If b is not null, where condition to add this line only. If c is not null, where condition should add only this line. OR condition No. it * /.
dbms_output.put_line (v_num);
end;
Or should I use dynamic SQL statements for this?
I was wondering if the two are NOT NULL? Well check this.
Select count (*) in v_num
table
where col1 = one
and col2 = (CASE WHEN (b is not null) THEN b ELSE END col2)
and col3 = (CASE WHEN (c is not null) THEN ELSE END col3 c)
-
get dynamic SQL CLOB in PLSQL?
Hello
I need to call a function to get a clob in return, but the name of this function is dynamic. This means that I get a user input and depends on the name of the function to call.
Problem is that this feature is also DML, so I can't do
EXECUTE IMMEDIATE 'select function_name_'||version||' from dual'
And I don't like the idea of
if .. then return function_nam_1 elsif .. then return function_nam_2 elsif .. then return function_nam_3 elsif .. then ...
So I think to use the DBMS_SQL package.
But what this part would look like exactly?
create or replace function execute_fkn_test(version number, p_input varchar2) return CLOB is -- does the SQL string need a change? v_sql varchar2(1000) := ' declare v_return_clob clob; begin v_return_clob:= test_function_'||version||'(p_param => '||p_input ||' ); end;'; v_dummy INTEGER; v_result CLOB; BEGIN EXECUTE IMMEDIATE v_sql; -- what to write here to get v_return_clob from dynamic SQL into v_result? return v_result; END;
Good bye
DPT
I don't know the reason for this design, but to answer your question from the academic point of view: you must use bind variables, like this:
create or replace function execute_fkn_test (version number, p_input varchar2) return clob
is
v_sql varchar2 (1000): = ' START: 1: = test_function_' | TO_CHAR (version) | "(p_param =>: 2); END;';
CLOB v_result;
Start
execute immediate v_sql using the v_result, in p_input
Return v_result;
end;
-
Create table form another table in different schema throwing error when dynamic sql
Hello
With the help of 11.2.0.3 and was following the issue.
To create a table in a schema (b) using data from another schema (b)
If independent run in sqlplus create works OK but same sql in dynamic sql block saying the table or view does not exist.
SQL even in dynamic sql
{code}
v_sql: =' create table new_table in select * from schemab.table_name where...';
run immediately (v_sql);
[code}
Other tables work fine.
Any ideas - don't want to grant all the schemaa.table schema b if can avoid.
Thank you
You run the immediate execution in an anonymous block or a stored procedure? If it is a stored procedure, then as others have said, the owner of the procedure must have select privileges on granted directly schemab.table_name.
Another possibility, which would be the case for a stored procedure, or an anonymous block is that your code is something like:
v_sql: =' create table new_table in select * from schemab.table_name where...';
immediately run v_sql;
Select count (*) in the l_count new_table;
who will fail at compile time because new_table does not exist.
When you create objects using dynamic sqly you dynamic sql user to reference them in the block of code.
John
-
Works with dynamic sql and list of numbers as return value
Hello.
Problems:
1. How can I insert the USERNAME variable in the string so it will be replaced over time.
2. I intend to return a list of IDS as 1,4,6,7,2 I want to use later in an IN clause.
How to complete the return function with the dynamic sql output variable?
I have no preference to dynamic sql but it was just something that came into my mind
When I thought that the implementation of the obligation to choose a list of offices for specific user groups.
(select statements from the sample are cut short, they're actually really big and I want to reuse this function in my)
BI Publisher data model for multiple modells).
CREATE or REPLACE FUNCTION F_OFFICES (-input parameters)
USERNAME IN VARCHAR2
USERGROUP IN VARCHAR2,
)
-Output parameter
RETURN VARCHAR2 AS
dynSQL VARCHAR2 (1000);
BEGIN
IF USERGROUP = "local" THEN
dynSQL: = 'xxx SELECT FROM CO_B WHERE Userid = username';
ELSIF USERGROUP = "regional" THEN
dynSQL: = "SELECT...". » ;
ELSIF USERGROUP 'federal' = THEN
dynSQL: = "SELECT...". » ;
END IF;
EXECUTE IMMEDIATE dynSQL;
-RETURN?;
END F_OFFICES;
Thanks for any help.As you have presented essentially pseudo-code we can only give you a Pseudo-solution :)
But the principle is:
... --Output parameter RETURN VARCHAR2 AS dynSQL VARCHAR2(1000); return_value varchar2(30): BEGIN IF USERGROUP = 'local' THEN dynSQL:= 'SELECT xxx FROM CO_B WHERE userid = :1'; -- placeholder for parameter ... END IF; EXECUTE IMMEDIATE dynSQL using USERNAME -- pass parameters in placeholder order into return_value; -- obviously this must match the projection of the dynamic query RETURN return_value; END F_OFFICES ;
This approach is not good if you want to vary the dynamic query projection. In this case, you can use a REF CURSOR or maybe DBMS_SQL.
Cheers, APC
-
Quoted string inside dynamic SQL
Hello
My version of db: database Oracle 11 g Enterprise Edition Release 11.2.0.1.0 - 64 bit Production
I run this code in a proc, and it goes to the exception block without running the code below:
I made a mistake with quoted strings and I have tried different combinations, but anyway his does not work.EXECUTE IMMEDIATE 'SELECT LISTAGG (entitlement, '''','''') WITHIN GROUP (ORDER BY entitlement) FROM XMLTABLE ( ''''/ROWSET/ROW/ENTITLEMENTS/ENTITLEMENT'''' PASSING XMLPARSE (DOCUMENT p_xmldoc) COLUMNS ENTITLEMENT VARCHAR2(30) PATH ''''.'''')' INTO v_str;
THA real piece of code is below, whick I'm trying to run immediately in a string
p_xmldoc sample is less thanSELECT LISTAGG (entitlement, ',') WITHIN GROUP (ORDER BY entitlement) FROM XMLTABLE ( '/ROWSET/ROW/ENTITLEMENTS/ENTITLEMENT' PASSING XMLPARSE (DOCUMENT p_xmldoc) COLUMNS ENTITLEMENT VARCHAR2(30) PATH '.')
My goal is to get'<?xml version="1.0"?> <ROWSET> <ROW> <ENTITLEMENTS> <ENTITLEMENT>AMEX</ENTITLEMENT> <ENTITLEMENT>JCB</ENTITLEMENT> </ENTITLEMENTS> </ROW> </ROWSET>'
v_str = AMEX, JCB
Please advice.Hello
Use the notation by Q.
Assuming that the dynamic control does not contain a right brace immediately before a single quote, you can say:sql_txt := Q'{SELECT LISTAGG (entitlement, ',') WITHIN GROUP (ORDER BY entitlement) ...}'; dbms_output.put_line (sql_txt || ' = sql_txt'); -- EXECUTE IMMEDIATE sql_txt;
With Q-rating, you can't excape double, or otherwise single quotes.
When you write code dynamic SQL, put the full command in a single VARCHAR2 variable (such as the sql_txt above). During the test, display it. If it looks right, then a comment the line where actually run you it.
-
error in dynamic sql code:
When I'm adding this code dynamically is error rechaussaient. Please can you find the error and tell me please
v_sql := v_sql||'tl.type = ''1'' and TL.TYPE IN (SELECT DECODE (LENGTH (tc.id),2,''AP''||tc.tagid,tc.tagid) tagid FROM traninfo tc, trancogroup tg WHERE tc.id = tg.id AND tc.req = tg.req AND tc.status = ''Y'' AND tg.smstype IN (SELECT SUBSTR (channel_desc,''1'',''2'') FROM deliverychannelinfo) AND tc.description ='||v_txntype||')';
980560 wrote:
When I'm adding this code dynamically is error rechaussaient. Please can you find the error and tell me pleasev_sql := v_sql||'tl.type = ''1'' and TL.TYPE IN (SELECT DECODE (LENGTH (tc.id),2,''AP''||tc.tagid,tc.tagid) tagid FROM traninfo tc, trancogroup tg WHERE tc.id = tg.id AND tc.req = tg.req AND tc.status = ''Y'' AND tg.smstype IN (SELECT SUBSTR (channel_desc,''1'',''2'') FROM deliverychannelinfo) AND tc.description ='||v_txntype||')';
The most important thing to consider when you use dynamic SQL statements, is to ensure that you are using Bind variables and not the value of filler directly as you did it tc.description ='| v_txntype |') ' ; + It is very bad.
Secondly, when you generate a string which uses apostrophes Q use notation that would be easier and more readable.
And on the error you get, that could be cause of there is no space before t1.type, then try this
v_sql := v_sql || q'[ tl.type = '1' and tl.type in (select decode (length (tc.id),2,'AP'||tc.tagid,tc.tagid) tagid from traninfo tc, trancogroup tg where tc.id = tg.id and tc.req = tg.req and tc.status = 'Y' and tg.smstype IN (SELECT SUBSTR (channel_desc,1,2) FROM deliverychannelinfo) and tc.description = :txn_type)]'
-
Hello gurus,
I have a doubt!
How to get the value of a dynamic sql inside the loop For?
Kind regardsDECLARE lv_v_sql VARCHAR2 (4000); BEGIN lv_v_sql := 'SELECT a FROM' || ' (SELECT 1 AS a FROM DUAL ' || 'UNION ALL ' || 'SELECT 2 AS a FROM DUAL' || ' UNION ALL ' || 'SELECT 3 AS a FROM DUAL ' || ' UNION ALL ' || ' SELECT 4 AS a FROM DUAL' || ' UNION ALL ' || ' SELECT 5 AS a FROM DUAL) ' || ' where a=' || 1; EXECUTE IMMEDIATE lv_v_sql; DBMS_OUTPUT.put_line (lv_v_sql); FOR i IN lv_v_sql LOOP DBMS_OUTPUT.put_line (i); END LOOP; END;
a friend :)Just add IN the clause EXECUTE IMMEDIATE. Example below shows you how to select EXECUTE IMMEDIATE data when it returns a single row and when she returns several lines:
SQL> DECLARE 2 lv_v_sql VARCHAR2 (4000); 3 v_a number; 4 v_a_tbl sys.OdciNumberList; 5 BEGIN 6 lv_v_sql := 7 'SELECT a FROM' 8 || ' (SELECT 1 AS a FROM DUAL ' 9 || 'UNION ALL ' 10 || 'SELECT 2 AS a FROM DUAL' 11 || ' UNION ALL ' 12 || 'SELECT 3 AS a FROM DUAL ' 13 || ' UNION ALL ' 14 || ' SELECT 4 AS a FROM DUAL' 15 || ' UNION ALL ' 16 || ' SELECT 5 AS a FROM DUAL) ' 17 || ' where a=' 18 || 1; 19 EXECUTE IMMEDIATE lv_v_sql 20 INTO v_a; 21 DBMS_OUTPUT.put_line (lv_v_sql); 22 DBMS_OUTPUT.put_line(v_a); 23 lv_v_sql := 24 'SELECT a FROM' 25 || ' (SELECT 1 AS a FROM DUAL ' 26 || 'UNION ALL ' 27 || 'SELECT 2 AS a FROM DUAL' 28 || ' UNION ALL ' 29 || 'SELECT 3 AS a FROM DUAL ' 30 || ' UNION ALL ' 31 || ' SELECT 4 AS a FROM DUAL' 32 || ' UNION ALL ' 33 || ' SELECT 5 AS a FROM DUAL) '; 34 EXECUTE IMMEDIATE lv_v_sql 35 BULK COLLECT 36 INTO v_a_tbl; 37 DBMS_OUTPUT.put_line (lv_v_sql); 38 FOR i IN 1..v_a_tbl.COUNT 39 LOOP 40 DBMS_OUTPUT.put_line(v_a_tbl(i)); 41 END LOOP; 42 END; 43 / SELECT a FROM (SELECT 1 AS a FROM DUAL UNION ALL SELECT 2 AS a FROM DUAL UNION ALL SELECT 3 AS a FROM DUAL UNION ALL SELECT 4 AS a FROM DUAL UNION ALL SELECT 5 AS a FROM DUAL) where a=1 1 SELECT a FROM (SELECT 1 AS a FROM DUAL UNION ALL SELECT 2 AS a FROM DUAL UNION ALL SELECT 3 AS a FROM DUAL UNION ALL SELECT 4 AS a FROM DUAL UNION ALL SELECT 5 AS a FROM DUAL) 1 2 3 4 5 PL/SQL procedure successfully completed.
SY.
Maybe you are looking for
-
iCloud contacts do not match the iPhone contacts.
My iCloud contacts are not all my contacts from the iPhone. I use the latest version of Firefox on Windows 10 PC. Same situation on my Mac with El Capitan and the latest Safari and Firefox browsers. Refreshing Contacts in iCloud changes nothing.
-
I've upgraded to Firefox 12.0. Now, when I try to reach my Gmail Calendar, he only returned in read-only mode. Temporarily, I went to explore. the calendar appears when editing without problem. What should be my next steps to solve this problem?
-
Very low volume on Portege R500
The volume on my R500 (R500 - 11 c to be exact) is ridiculously low. Only with the volume at maximum (100) and using headphones I hear nothing, and even in this case, it is far too low to be useful. I can just do the test sounds to the left and then
-
Update Windows error 80073712 and 800 b 0100
I have two windows Vista update error. One is for the security update error 800b0100 kb977816. Second is kb980248 gives error 80073712. Ive tried everything. Deleted antivirus package. Restart and scan disk. Ive downloaded system update readiness too
-
Theme Aero works do not mistake "Desktop Windows Manager is disabled.
Original title: Troubleshoot Aero gives weird errorI want to activate Aero so I can have all the cool kids stuff xD OK, we'll take it seriously. I tried to activate Aero but Windows Ultimate 7 x 64 won't LET me. I ran the resolution of the problems i