How to escape ' in dynamic sql
Dear Experts,I'm trying to escape single quote (') in dynamic sql, but could not find a way, I used the escape character / and two single quotes "but it did not work.
Here I am trying to generate dynamic SQL statements:
SQL > select ' exec dbms_stats.gather_index_stats (ownname = > \'SYSADM\', indname = >--------"|) INAME | '--------', estimate_percent = > DBMS_STATS. AUTO_SAMPLE_SIZE);' from test_missing_index;
Select ' exec dbms_stats.gather_index_stats (ownname = > 'SYSADM', indname = > "|) INAME | ", estimate_percent = > DBMS_STATS. AUTO_SAMPLE_SIZE);' from test_missing_index
*
ERROR on line 1:
ORA-00923: THE KEYWORD not found where expected
The desired to put should be:
exec dbms_stats.gather_index_stats (ownname = > 'SYSADM', indname = > 'test_index', estimate_percent = > DBMS_STATS.) AUTO_SAMPLE_SIZE);
Any help will be much appreciated
Rajasekharan Dinesh wrote:
Dear Experts,I'm trying to escape single quote (') in dynamic sql, but could not find a way, I used the escape character / and two single quotes "but it did not work.
Two single quotes (withsome kind of escape aby) is correct.
From Oracle 10, you might find easier to use Q-rating:
select Q'{exec dbms_stats.gather_index_stats(ownname=>'SYSADM', indname=>'}'
|| iname
|| Q'{', estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE);}'
from test_missing_index;
Read all about it in the manual of the SQL language. Search for "literal text".
http://download.Oracle.com/docs/CD/B28359_01/server.111/b28286/sql_elements003.htm#sthref337
2 quotes using simple (in any version of Oracle), you could do it like this:
select 'exec dbms_stats.gather_index_stats(ownname=>''SYSADM'', indname=>'''
|| iname
|| ''', estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE);'
from test_missing_index;
The string must have a right single quotation mark before inname. It will be inside a literal text, so it must be doubled. Who is be the last thing in this literal text, so the single quotes that ends the literal comes just after him, having for result 3 consecutive single quotes.
Similarly, the literal immediately after iname begins with a single quote, therefore, immediately following the single quote which begins that literal, you have 2 single quotes.
Published by: Frank Kulash, October 27, 2011 19:47
Tags: Database
Similar Questions
-
How to integrate the dynamic SQL generated in the data definition XML file?
Hi all
I have it here is the XML file that is attached to the definition of data model RTF as below. Also, I have a function that will return to create a dynamic query as shown below.
<?xml version="1.0" encoding="UTF-8"?> <dataTemplate name="XYZ" description="iExpenses Report" Version="1.0"> <dataQuery> <sqlStatement name="Q2"> <![CDATA[
-
Hi all
I have a procedure that takes as an input parameter v_emp_id which is of type varchar.
emp_id are sent separated by commas to v_emp_id. Ex: v_emp_id = 7,2,1
In my code I use a cursor for loop recover data from the table emp like this
I'm in (select * from emp where emp_id in v_emp_id) loop
-----
end loop;
It does not work. How do I use dynamic sql statements to retrieve data by using the CURSOR LOOP FOR only?
Thanks in advanceMR Marie wrote:
How do I use dynamic sql statements to retrieve data by using the CURSOR LOOP FOR only?
Not with dynamic sql statements. I suggest you use collections:
SQL> create or replace 2 procedure p1( 3 p_empno sys.OdciNumberList 4 ) 5 is 6 begin 7 for v_rec in (select ename from emp where empno in (select * from table(p_empno))) loop 8 dbms_output.put_line(v_rec.ename); 9 end loop; 10 end; 11 / Procedure created. SQL> set serveroutput on SQL> exec p1(sys.OdciNumberList(7566,7844,7900)); JONES TURNER JAMES PL/SQL procedure successfully completed. SQL>
SY.
-
If testrh2 of the table has the following columns and data
col1-> NULL
col2-> 2
and table testrh has the columsn and the following data
col1-> NULL
How to write a dynamic SQL statement to join on null values? I wrote the following as a starting point block.
declare
cursor c1 is select col1 isis.testrh;
lval varchar2 (1000);
lval2 varchar2 (1000);
Start
to r1 c1 loop
lval: = 'select col2 from isis.testrh2 where col1 =' | R1.Col1;
run immediately lval in lval2;
dbms_output.put_line (lval2);
end loop;
end;arizona9952 wrote:
How to write a dynamic SQL statement to join on null values? I wrote the following as a starting point block.
Identical to static SQL:
lval: = ' select col2 from isis.testrh2 where col1 =: 1 or (col1 is null and: 1 is nothing)';
run immediately in lval2 using r.col1 lval, r.col1;SY.
PS I guess that's a simplified version of a logic more complex. Otherwise ther is not necessary for dynamic SQL statements.Published by: Solomon Yakobson October 2, 2010 17:06
-
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 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)
-
How to implement dynamic sql in owb
Hello world
I'm new to OWB and so I want to know how I can implement the dynamic sql statement in owb...
Declare
Cursor C_tab_col is
Select the cat of tbl_cat_edesc_1;
VCAT varchar2 (240);
Cursor C_edesc_col is
Select edesc in the tbl_cat_edesc_1;
Vedesc varchar2 (240);
V_Command varchar2 (30000);
Begin
C_Tab_col open;
Extract C_tab_col in vcat;
C_edesc_col open;
Extract the C_edesc_col in vedesc;
loop
V_Command: = "update upd_catseg_1 set c. c." | VCAT | » =';
V_Command: = V_Command | "(select d.sales in the TEST_catseg of;)
V_Command: = V_Command |' where edesc = ' | " ' || vedesc | " (' |' and c.cardno = d.cardno)';
dbms_output.put_line (10 ' |) V_command);
Immediately run v_command;
Extract C_tab_col in vcat;
When the output c_tab_col % notfound;
Extract the C_edesc_col in vedesc;
When the output c_edesc_col % notfound;
end loop;
commit;
end;
Thank you very muchIf you use oracle workflow just drag and drop the transformation... no need to create a mapping, because your procedure requires the intervention of a table.
If you do use oracle workflow. Then change the mapping. Remove the table and replace it with constanct and pass a dummy value of constant in your procedure.
Your existing map is taken on time because the mapping runs the same procedure for each row in TBL_CAT_EDESC_BRAND.
And your procedure is already using it. So NO need for this table in the mapping. Just a constant and your transformation will do the job for you.I hope this helps. :-)
Kind regards
SamPublished by: user571269 on October 26, 2009 20:06
-
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 use Bulk collect in dynamic SQL with the example below:
My Question is
Using of dynamic SQL with collection in bulkif we pass the name of the table as "to the parameter' function, I want to display those
An array of column names without vowels (replace the vowels by spaces or remove vowels and display).
Please explain for example.
Thank you!!It's just a predefined type
SQL> desc sys.OdciVarchar2List sys.OdciVarchar2List VARRAY(32767) OF VARCHAR2(4000)
You can just as easily declare your own collection type (and you are probably better served declaring your own type of readability if nothing else)
SQL> ed Wrote file afiedt.buf 1 CREATE OR REPLACE 2 PROCEDURE TBL_COLS_NO_VOWELS( 3 p_owner VARCHAR2, 4 p_tbl VARCHAR2 5 ) 6 IS 7 TYPE vc2_tbl IS TABLE OF varchar2(4000); 8 v_col_list vc2_tbl ; 9 BEGIN 10 EXECUTE IMMEDIATE 'SELECT COLUMN_NAME FROM DBA_TAB_COLUMNS WHERE OWNER = :1 AND TABLE_NAME = :2 ORDER BY COLUMN_ID' 11 BULK COLLECT 12 INTO v_col_list 13 USING p_owner, 14 p_tbl; 15 FOR v_i IN 1..v_col_list.COUNT LOOP 16 DBMS_OUTPUT.PUT_LINE(TRANSLATE(v_col_list(v_i),'1AEIOU','1')); 17 END LOOP; 18* END; SQL> / Procedure created. SQL> exec tbl_cols_no_vowels( 'SCOTT', 'EMP' ); MPN NM JB MGR HRDT SL CMM DPTN PL/SQL procedure successfully completed.
Justin
-
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?
-
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 -
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
-
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
-
Bays of mathscript rt module-3D LV2013
In these forum discussions, I have seen that earlier versions of the labview mathscript rt module did not support 3D tables. Does anyone know if this is still the case with LV2013 or LV2014? I use LV2013 and tried to create a 3D chart > C = zeros (3,
-
15 - ac121dx: unknown device driver - HP laptop (model 15-ac121dx)
Hey everybody, had a pilot that I can't identify or can Assistant hp support fix. This is the hw id. IF anyone knows a software driver for this problem it would be most appreciated if you reply to this message. acpi\msft0101msft0101 Rgds, M
-
Performance w / microSD class 2 vs 4 &; 6
I wonder if the speed of the card makes a difference in playback of audio files. He could so have anyone of you tried a class 2 microSD in the slotMusic player? Who worked smoothly, or actually play it better on higher speed card?
-
Memory controller problem?
My new X230T works well for most, but I also had the odd problem here and there, who seemed at first view to focus on the SW. However, memory is "basic" Windows Memory Diagnostic, but crashes at 21% when I try to run this "extended". Since the resu
-
How low-level format using the code debugging?
original title: how to low-level format using the debug code? can someone give a code How low-level format using the code debugging? can someone give a code