Dynamic sql and block based on a stored procedure
Hi!
I'm triying to generate a block based on a stored procedure. I want the stored procedure to execute a dynamic sql, but I'm having getting the error "PLS-00455 cursor 'AULOCASLATE' cannot be used in dynamic SQL OPEN statement".
I have the following code:
CREATE OR REPLACE package pkg_f0015 is
type rClieInstSlate is record
(clie_id CMS_CLIENTS.ID%type
,client_nm varchar2(1000)
,cs_no CMS_CLIENTS.CS_NO%type
,dob CMS_CLIENT_NAMES.BIRTH_DT%type);
type tClieInstSlate is table of rClieInstSlate;
type uClieInstSlate is ref cursor return rClieInstSlate;
procedure prLocationSlateQry(
auLocaSlate in out uClieInstSlate, anCsNo in CMS_CLIENTS.CS_NO%type,
avClieNm in varchar2,
avSearchType in varchar2,
avLotyCd in CMS_LOCATION_TYPES.CD%type);
end pkg_f0015;
CREATE OR REPLACE PACKAGE BODY pkg_cms_f0015 is
procedure PRLocationSlateQry( auLocaSlate in out uClieInstSlate,
anCsNo in CMS_CLIENTS.CS_NO%type,
avClieNm in varchar2,
avSearchType in varchar2,
avLotyCd in CMS_LOCATION_TYPES.CD%type) IS
vSelect varchar2(5000);
vAddCond varchar2(1000);
vSupLevel varchar2(50);
begin
vSelect := 'select clie.ID,'||
' CLIENT_NAME,'||
' clie.CS_NO,'||
' clna.BIRTH_DT dob'
' from CMS_CLIENT_NAMES clna,'||
'CMS_CLIENTS clie'||
' where clna.CLIE_ID = clie.ID';
if avSearchType= 'C' then
vAddCond := ' and clie.CS_NO = nvl('||anCsNo||',clie.CS_NO)';
vSelect := vSelect || vAddCond;
open auLocaSlate for vSelect;
end if;
end PRLocationSlateQry;
end;
I wonder if what I want is possible
OK,
Now it works. Previously we had the parameter p_guid declared as RAW, which obviously is not any good. :)
Radovan
Edited by: biciste on Apr 28, 2009 4:57 PM
Similar Messages
-
Dynamic SQL and Data with Single Quotes in it.
Hi There,
I have a problem in that I am using dynamic SQL and it happens that one of the columns does contain single quotes (') in it as part of the data. This causes the resultant dynamic SQL to get confused as the single quote that is part of the data is taken to mean end of sting, when in fact its part of the data. This leaves out a dangling single quote that was meant to enclose the string. Here is my dynamic SQL and the result of the parsed SQL that I have captured:
****Dynamic SQL*****
l_sql:='select NOTE_TEMPLATE_ID '||
'FROM TMP_NOTE_TEMPLATE_VALUES '||
'where TRIM(LEGACY_NOTE_CODE)='''||trim(fp_note_code)||''' '||
'and TRIM(DISPLAY_VALUE)='''||trim(fp_note_text)||''' ';
execute immediate l_sql INTO l_note_template_id;
Because the column DISPLAY_VALUE contains data with single quotes, the resultant SQL is:
******PARSED SQL************
select NOTE_TEMPLATE_ID
FROM TMP_NOTE_TEMPLATE_VALUES
where TRIM(LEGACY_NOTE_CODE)='INQ' and TRIM(DISPLAY_VALUE)='Cont'd'
And the problem lies with the single quote between teh characters t and d in the data field for DISPLAY_ITEM. How can I handle this?
Many thanks,I have been reliably informed that if one doesn't enclose char/varchar2 data items in quotes, the right indices may not be usedI am into oracle for past 4 years and for the first time i am hearing this.
Your reliable source is just wrong. Bind variables are variables that store your value and which are used in SQL. They are the proper way to use values in your SQL. By default all variables in PL/SQL is bind variable.
When you can do some thing in just straight SQL just do it. Dynamic SQL does not make any sense to me here.
Thanks,
Karthick. -
Dynamic SQL and Bulk Bind... Interesting Problem !!!
Hi Forum !!
I've got a very interesting problem involving Dynamic SQL and Bulk Bind. I really Hope you guys have some suggestions for me...
Table A contains a column named TX_FORMULA. There are many strings holding expressions like '.3 * 2 + 1.5' or '(3.4 + 2) / .3', all well formed numeric formulas. I want to calculate each formula, finding the number obtained as a result of each calculation.
I wrote something like this:
DECLARE
TYPE T_FormulasNum IS TABLE OF A.TX_FORMULA%TYPE
INDEX BY BINARY_INTEGER;
TYPE T_MontoIndicador IS TABLE OF A.MT_NUMBER%TYPE
INDEX BY BINARY_INTEGER;
V_FormulasNum T_FormulasNum;
V_MontoIndicador T_MontoIndicador;
BEGIN
SELECT DISTINCT CD_INDICADOR,
TX_FORMULA_NUMERICA
BULK COLLECT INTO V_CodIndicador, V_FormulasNum
FROM A;
FORALL i IN V_FormulasNum.FIRST..V_FormulasNum.LAST
EXECUTE IMMEDIATE
'BEGIN
:1 := TO_NUMBER(:2);
END;'
USING V_FormulasNum(i) RETURNING INTO V_MontoIndicador;
END;
But I'm getting the following messages:
ORA-06550: line 22, column 43:
PLS-00597: expression 'V_MONTOINDICADOR' in the INTO list is of wrong type
ORA-06550: line 18, column 5:
PL/SQL: Statement ignored
ORA-06550: line 18, column 5:
PLS-00435: DML statement without BULK In-BIND cannot be used inside FORALL
Any Idea to solve this problem ?
Thanks in Advance !!Hallo,
many many errors...
1. You can use FORALL only in DML operators, in your case you must use simple FOR LOOP.
2. You can use bind variables only in DML- Statements. In other statements you have to use literals (hard parsing).
3. RETURNING INTO - Clause in appropriate , use instead of OUT variable.
4. Remark: FOR I IN FIRST..LAST is not fully correct: if you haven't results, you get EXCEPTION NO_DATA_FOUND. Use Instead of 1..tab.count
This code works.
DECLARE
TYPE T_FormulasNum IS TABLE OF VARCHAR2(255)
INDEX BY BINARY_INTEGER;
TYPE T_MontoIndicador IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
V_FormulasNum T_FormulasNum;
V_MontoIndicador T_MontoIndicador;
BEGIN
SELECT DISTINCT CD_INDICATOR,
TX_FORMULA_NUMERICA
BULK COLLECT INTO V_MontoIndicador, V_FormulasNum
FROM A;
FOR i IN 1..V_FormulasNum.count
LOOP
EXECUTE IMMEDIATE
'BEGIN
:v_motto := TO_NUMBER('||v_formulasnum(i)||');
END;'
USING OUT V_MontoIndicador(i);
dbms_output.put_line(v_montoindicador(i));
END LOOP;
END;You have to read more about bulk- binding and dynamic sql.
HTH
Regards
Dmytro
Test table
a
(cd_indicator number,
tx_formula_numerica VARCHAR2(255))
CD_INDICATOR TX_FORMULA_NUMERICA
2 (5+5)*2
1 2*3*4
Message was edited by:
Dmytro Dekhtyaryuk -
I want need to use dynamic SQL, and include a subquery in the where clause. However, I am getting a syntax error.
I have code that looks like this.
SELECT (p_v_sqlobj_select)
INTO CORRESPONDING FIELDS OF TABLE <matrix>
FROM (p_v_sqlobj_from)
WHERE (p_v_sqlobj_where).
and I pass it the following bold-faced SQL where clause (please ignore whether the statement makes sense and is the best way to do it - this is just to illustrate). However, it returns an error.
select tcode from tstc where tcode in <b>( select min( tcode ) as min from tstc )</b>
Am I correct in concluding that I cannot pass complex statements, or have I just missed something?
Thanks for any help.Hi,
Please try with order by clause in select statement and also use descending
select * from (p_table)
into corresponding fields of table <ptab>
up to p_rows rows
order by <fieldname> descending.
aRs -
Help w/ dynamic sql in form based on proc.
First, I'm not the most brilliant at this so I might be missing something basic.
I have a form based off a stored procedure. In that procedure, I have an update statement that is built dynamically from session variables. It won't work because I am putting the update statement together from variables. How can I get around this?
example:
Here is the problematic code in my procedure:
update my_schema.my_table_synonym
set
v_myfield = v_myvar
where myid = v_myid;
I am pulling the variables from session storage I created earlier in the application. It doesn't seem to like that the field is a variable... is there a way to do this? I would prefer to use this in my application dozens of times rather than copy it dozens of times with slight changes.ok, nevermind... I figured my problem out.
All I needed was something like this:
v_sql := 'update mytable set ' || myfield || ' = ''HELLO';
EXECUTE IMMEDIATE v_sql; -
How do I get data to the from in a form based on a stored procedure
I would like to create a form based on a stored procedure. I have bound LOV's that lookup the ID of the data that is to be displayed on the form. Then I have a button that reads the database and populates the fields on the form. This is our current UI standard on our portal site, and I need to copy that UI exactly in order to mix HTML DB code with our current portal code because we can not afford to re-write all our code in portal to HTML DB. Can this be done, and how can it be done? Thanks
We are developing an entire HR system for our organization using portal forms. I am trying to prototype in HTML DB to see if we can switch our future development to this new product. However, we already have 50 or so forms that follow a certain user interface look and feel in portal. I am trying to create this interface look and feel in HTML DB. What we are doing in Portal is have a lookup section at the top of each form where you find the record you want to update with LOV's, sometimes 2 or 3 bound together, and then have a lookup button that does PL/SQL to read the database and populate the fields on the form. Then there is an Update button at the end of the form that takes the fields off the form and passes them to a stored procedure. I can not figure out how to do the Lookup button type of code to read information and bring it to the form when doing a form based on a stored procedure.
-
How to find the columns and tables used in a stored procedure?
Hi,
Can someone suggest how to find the columns and tables used within a stored procedure?
Thanks
VBKFor example:
SQL> create or replace
2 procedure p1
3 is
4 cnt number;
5 begin
6 select count(*) into cnt from emp;
7 end;
8 /
Procedure created.
SQL> select referenced_owner,
2 referenced_name
3 from dba_dependencies
4 where owner = 'SCOTT'
5 and name = 'P1'
6 and referenced_type = 'TABLE'
7 /
REFERENCED_OWNER REFERENCED_NAME
SCOTT EMP
SQL> SY. -
Hi,
We have two SharePoint 2010 SP2 servers with one SQL 2012 Backend.
Recently we cannot open the central administration, getting 500 internal server error and multiple SQL errors in event viewer:
event id 5586 sharepoint foundation unknown sql exception 2812 could not find stored procedure dbo.proc_gettimerlock
event id 5586 sharepoint foundation unknown sql exception 2812 occured could not find stored procedure 'proc_fetchdocforhttpget'
Also I cannot run SharePoint configuration wizard, getting this error: sharepoint 2010 failed to resgister sharepoint services
In the log file, I found this error "an exception of type microsoft.sharepoint.spexception was thrown 0x80131904"
Any ideas?
Thanks, ShehatovichAs You can see below stored procedure has its specific Permission's, check user who is performing action as well as CentralAdministation Pool has right permission and their permissions are not modified from SQL Server.
-Samar
=
Sr. Software engineer -
Dynamic SQL and Oracle stored procedures
Does anybody has any experience with invoking an Oracle stored procedures
with output parameters, using dynamic SQL from Forte?
Thanks,
DimitarI would be interested. We are currently using a homegrown DataMapper architecture with the Microsoft OracleClient. I would like to move to ODP.Net once a production version supporting ADO.Net 2.0 is available. After that, I would then like to look at using an off the shelf persistence framework such as EntitySpaces, NHibernate or IdeaBlade's DevForce.
-
Dynamic sql and bind variables
Hi,
I have a stored procedure which filters a table on 5 five columns. The filters come from the input parameters,
and these 5 parameters can come in any combination, I mean some of them may be null and some of them may not be null.
So I constructed the where filter of the query with IF blocks like the following:
dynamic_query := 'select * from TESTTABLE where 1= 1';
IF (P1 is not null) THEN
dynamic_query := dynamic_query || ' AND column1 = :1';
END IF;
IF (P2 is not null) THEN
dynamic_query := dynamic_query || ' AND column2 = :2';
END IF;
IF (P3 is not null) THEN
dynamic_query := dynamic_query || ' AND column3 = :3';
END IF;
IF (P4 is not null) THEN
dynamic_query := dynamic_query || ' AND column4 = :4';
END IF;
IF (P5 is not null) THEN
dynamic_query := dynamic_query || ' AND column5 = :5';
END IF;
OPEN CUR_OUT FOR dynamic_query USING P1, P2, P3, P4, P5;
The problem is how can I construct the USING and bind parameters, I cannot use "USING P1, P2, P3, P4, P5" because some of bind variables
may not be in dynamic query if the input parameters are null. Is there a way to overcome this problem without writing all the 2 ^ 5 combinations?
Any help is greatly appreciated.here it is in the Tomer Cohen way:
IF (P1 is not null) THEN
dynamic_query := dynamic_query || ' AND column1 = :1';
ELSE
dynamic_query := dynamic_query || ' AND :1 IS NULL';
END IF;
IF (P2 is not null) THEN
dynamic_query := dynamic_query || ' AND column2 = :2';
ELSE
dynamic_query := dynamic_query || ' AND :2 IS NULL';
END IF;
IF (P3 is not null) THEN
dynamic_query := dynamic_query || ' AND column3 = :3';
ELSE
dynamic_query := dynamic_query || ' AND :3 IS NULL';
END IF;
IF (P4 is not null) THEN
dynamic_query := dynamic_query || ' AND column4 = :4';
ELSE
dynamic_query := dynamic_query || ' AND :4 IS NULL';
END IF;
IF (P5 is not null) THEN
dynamic_query := dynamic_query || ' AND column5 = :5';
ELSE
dynamic_query := dynamic_query || ' AND -1 = :5';
END IF;
OPEN CUR_OUT FOR dynamic_query USING P1, P2, P3, P4, P5;Amiel Davis -
Dynamic sql and ref cursors URGENT!!
Hi,
I'm using a long to build a dynamic sql statement. This is limited by about 32k. This is too short for my statement.
The query results in a ref cursor.
Does anyone have an idea to create larger statement or to couple ref cursors, so I can execute the statement a couple of times and as an result I still have one ref cursor.
Example:
/* Determine if project is main project, then select all subprojects */
for i in isMainProject loop
if i.belongstoprojectno is null then
for i in ProjectSubNumbers loop
if ProjectSubNumbers%rowcount=1 then
SqlStatement := InitialStatement || i.projectno;
else
SqlStatement := SqlStatement || PartialStatement || i.projectno;
end if;
end loop;
else
for i in ProjectNumber loop
if ProjectNumber%rowcount=1 then
SqlStatement := InitialStatement || i.projectno;
else
SqlStatement := SqlStatement || PartialStatement || i.projectno;
end if;
end loop;
end if;
end loop;
/* Open ref cursor */
open sql_output for SqlStatement;
Thanks in advance,
Jeroen Muis
KCI Datasystems BV
mailto:[email protected]Example for 'dynamic' ref cursor - dynamic WHERE
(note that Reports need 'static' ref cursor type
for building Report Layout):
1. Stored package
CREATE OR REPLACE PACKAGE report_dynamic IS
TYPE type_ref_cur_sta IS REF CURSOR RETURN dept%ROWTYPE; -- for Report Layout only
TYPE type_ref_cur_dyn IS REF CURSOR;
FUNCTION func_dyn (p_where VARCHAR2) RETURN type_ref_cur_dyn;
END;
CREATE OR REPLACE PACKAGE BODY report_dynamic IS
FUNCTION func_dyn (p_where VARCHAR2) RETURN type_ref_cur_dyn IS
ref_cur_dyn type_ref_cur_dyn;
BEGIN
OPEN ref_cur_dyn FOR
'SELECT * FROM dept WHERE ' | | NVL (p_where, '1 = 1');
RETURN ref_cur_dyn;
END;
END;
2. Query PL/SQL in Reports
function QR_1RefCurQuery return report_dynamic.type_ref_cur_sta is
begin
return report_dynamic.func_dyn (:p_where);
end;
Regards
Zlatko Sirotic
null -
Dynamic sql and updating cursors
hi to anyone,
we use few temporary global tables which will be created on the fly if not present ( the reason is - they are not created by power designer ).
addressing theses tables is only possible by using dynamic sql via "execute immediate" because they may not be known to the compiler as they are not created yet.
Now I defined a cursor to walk through the table - using cursor reference "ref cursor". Using this cursor works, but i found no way using this cursor for update. i.e. declaring as .. for update of and later putting it into an execute immediate like " execute immediate 'update ' || w_temp_table || ' set f1 = :1, f2 = :2 where current of ' || w_cursor using w_1, w_2;" It doesnt work if I block this command using "begin / end".
Does naybody know a solution ?
thanks in advance
wilkoThanks todd,
my main purpose has been just using the dynamic cursor for update as I know that this is quite easy and also fast. I didnt concern about locking all rows I walk through. But you are right - at end you will use the most easy way. So what I did because of another cursor problem ( with analytical functions ) - I defined the temporary table before compiling and everything is much more convenient.
thanks for help
wilko -
Hi all,
I'm under 10G r1
I want to execute a dynamic SQL with merge in it
when I try with insert ,update it works
but I just want to use merge if possible
this is the code
CREATE OR REPLACE
PROCEDURE I_COLUMN_CDS_FIXINGS
v_ticker VARCHAR2,
v_date DATE,
v_tenor VARCHAR2,
v_bid NUMBER,
v_ask NUMBER)
AS
l_column VARCHAR2(80);
v_column_bid VARCHAR2(80);
v_column_ask VARCHAR2(80);
v_source VARCHAR2(60) :='CMAN@BBG';
v_gen_order pls_integer;
BEGIN
SELECT 'CDS_SPREAD_'
||v_TENOR
||'_BID'
INTO v_column_bid
FROM dual;
SELECT 'CDS_SPREAD_'
||v_TENOR
||'_ASK'
INTO v_column_ask
FROM dual;
dbms_output.put_line(v_ticker||' '||v_column_ask||' '||v_column_bid||' '||v_bid|| ' '||v_ask||' '||v_date);
EXECUTE immediate 'MERGE into CDS_FIXINGS C
using ( select v_ticker,'
||v_column_bid
||','
||v_column_ask
||',trunc(v_date) info_date ,v_bid,v_ask from dual ) B
on (C.cds_ticker=b.v_ticker and c.info_date=b.info_date)
WHEN MATCHED THEN
update set '||v_column_bid||'=:1,'||v_column_ask||'=:2 using v_bid,v_ask
WHEN NOT MATCHED THEN
INSERT
CDS_TICKER ,
INFO_DATE ,
'||v_column_bid||' ,
'||v_column_ask||' ,
SOURCE
VALUES (:1, :2,:3,:4,:5) ' using v_ticker,
v_date ,
v_bid ,
v_ask ,
v_source
---EXCEPTION
---when others then raise;
end;
when I launch hte procedure
exec i_column_cds_fixings('TEST',trunc(sysdate-1),'8Y',4232.01,4234.02);
I get
ERROR at line 1:
ORA-00933: SQL command not properly ended
ORA-06512: at "OWNER_HISTO.I_COLUMN_CDS_FIXINGS", line 26
ORA-06512: at line 1
How can I deal with this
Thanks
babata
I getSorry
this is formatted one
REATE OR REPLACE PROCEDURE i_Column_cds_FixIngs
(v_Ticker VARCHAR2,
v_Date DATE,
v_Tenor VARCHAR2,
v_Bid NUMBER,
v_Ask NUMBER)
AS
l_Column VARCHAR2(80);
v_Column_Bid VARCHAR2(80);
v_Column_Ask VARCHAR2(80);
v_Source VARCHAR2(60) := 'CMAN@BBG';
v_gen_Order PLS_INTEGER;
BEGIN
SELECT 'CDS_SPREAD_'
||v_Tenor
||'_BID'
INTO v_Column_Bid
FROM Dual;
SELECT 'CDS_SPREAD_'
||v_Tenor
||'_ASK'
INTO v_Column_Ask
FROM Dual;
dbms_Output.Put_Line(v_Ticker
||' '
||v_Column_Ask
||' '
||v_Column_Bid
||' '
||v_Bid
||' '
||v_Ask
||' '
||v_Date);
EXECUTE IMMEDIATE 'MERGE into CDS_FIXINGS C
using ( select v_ticker,'
||v_Column_Bid
||','
||v_Column_Ask
||',trunc(v_date) info_date ,v_bid,v_ask from dual ) B
on (C.cds_ticker=b.v_ticker and c.info_date=b.info_date)
WHEN MATCHED THEN
update set '
||v_Column_Bid
||'=:1,'
||v_Column_Ask
||'=:2 USING v_bid,v_ask
WHEN NOT MATCHED THEN
INSERT
CDS_TICKER ,
INFO_DATE ,
||v_Column_Bid
||' ,
||v_Column_Ask
||' ,
SOURCE
VALUES
:1,
:2,
:3,
:4,
:5
USING v_Ticker,v_Date,v_Bid,v_Ask,v_Source;
---EXCEPTION
---when others then raise;
END;
/ -
We are running an oracle sql procedure that uses a LOT of dynamic sql. We are using a 3rd party package (SQR) as a sort of shell to run the sql procedure. The 3rd party package passes to us an oracle error. This error says, in effect, that there are no inactive database cursors available and that the sql program is too large to process. We conclude from this that we must increase one or more of the cursor parameters in init.ora (v$parameters). Is this the correct assumption? If not, does anyone know what we can do? We'd prefer not to break up the sql procedure into smaller pieces.
increase the parameter for open cursors.
check, wether all cursors in your programs are closed in time, or if you are using ref cursors from front-ends (e.g. Java JDBC) that this front-ends close these ref cursors , too.
If you want to decrease the size of procedures get rid of comments, superfluos spaces, tabs, etc.
keep a commented version outside vor documentation purposes.
Hope thsi helps -
Dynamic SQL and GRANT CREATE ANY TABLE
hi gurus,
i have a dynamic SQL in a procedure where a table will be created from an existing table without data.
strSQL:='create table ' || strTemp || ' as select * from ' || strArc || ' where 1=2';
execute immediate strSQL;
without GRANT CREATE ANY TABLE for the user, *"ORA-01031: insufficient privileges"* error during execution.
Is there a way to tackle this issue without providing GRANT CREATE ANY TABLE privilige?
many thanks,
Charlesravikumar.sv wrote:
The problem is not because of dynamic sql...It probably has something to do with dynamic SQL or, more accurately, dynamic SQL within a stored procedure.
From a SQL*Plus command prompt, you can create a table if your account has the CREATE TABLE privilege either granted directly to it or granted to a role that has been granted to your account. Most people probably have the CREATE TABLE privilege through a role (hopefully a custom "developer role" that has whatever privileges you grant to users that will own objects but potentially through the default RESOURCE role). That is not sufficient to create tables dynamically via a definer's rights stored procedure. Only privileges that are granted directly to the user, not those granted via a role, are visible in that case.
I expect that the DBAs are granting the CREATE ANY TABLE privilege directly to the account in question rather than through whatever role(s) are being used which is why that appears to solve the problem.
Justin
Maybe you are looking for
-
I have a Web Service (WSDL URL) that I would like to consume so that I can retrieve data to be displayed in my Web Dynpro application. Can I access a Web Service using Web Dynpro for ABAP or must I use Web Dynpro for Java? Please point me to any do
-
The iPhone software update server could not me contacted.
Hello, im using an iPhone 3GS , current version is 4.3.5. I get this error when i click Check for Updates. The iPhone software update server could not me contacted. Make sure your netword settings are correct and your netword connection is active, or
-
OPatch failed with error code = 255
Hello, I have installed Oracle 9.2.0.1 in my system. Now, i want to apply a patch on that Oracle by using Opatch. But when i try to apply Optach, i am facing teh follwing error "Please make sure you are running OPatch with JRE version 1.4 or later. O
-
HP 635 SERIAL:5CB2070CH3 / WIN 7/32 My audio driver do not support a 5.1 sistem and I don t find one to configure that.
-
Downloading App store purchased Mountain Lion installer onto Mac with preinstalled OS X
I need to reinstall Mountain Lion on my Mac Book Pro. I purchased ML on the app store but need to create a bootable USB key. The only Mac I have available to do this is my girlfriend's new MacBook Air. This has a preinstalled version of Mountain Lio