Dynamic SQL and use of aggregate functions
Hello Forum members,
I'm trying to create dynamic SQL in a function module and return the MAX value of a field.
I am passing in a parameter called CREATE_FIELD_NAME, and my SQL is
SELECT MAX(CREATE_FIELD_NAME) INTO (CREATE_DATE) FROM (TABLE_NAME).
I also tried:
SELECT MAX((CREATE_FIELD_NAME)) INTO (CREATE_DATE) FROM (TABLE_NAME).
But abap is not recognizing my variable as a variable in either case, but rather, as a field name.
Anyone know a way around this?
Thanks in advance,
Jeff
Here is my program:
FUNCTION ZJLSTEST4.
""Local Interface:
*" IMPORTING
*" VALUE(TABLE_NAME) LIKE MAKT-MAKTX
*" VALUE(CREATE_FIELD_NAME) LIKE MAKT-MAKTX
*" VALUE(UPDATE_FIELD_NAME) LIKE MAKT-MAKTX
*" EXPORTING
*" VALUE(MAX_DATE) LIKE SY-DATUM
DATA: CREATE_DATE LIKE MCHA-ERSDA VALUE '19000101',
UPDATE_DATE LIKE MCHA-LAEDA VALUE '19000101'.
SELECT MAX(CREATE_FIELD_NAME) INTO (CREATE_DATE) FROM (TABLE_NAME).
ENDSELECT.
*SELECT MAX((UPDATE_FIELD_NAME)) INTO (UPDATE_DATE) FROM (TABLE_NAME).
*ENDSELECT.
IF CREATE_DATE > UPDATE_DATE.
MAX_DATE = CREATE_DATE.
ELSE.
MAX_DATE = UPDATE_DATE.
ENDIF.
IF MAX_DATE = '19000101'.
MAX_DATE = SY-DATUM.
ENDIF.
ENDFUNCTION.
Max is right, you need the spaces, as in my example.
You might like to try this:
data: l_CREATE_FIELD_NAME) LIKE MAKT-MAKTX,
l_UPDATE_FIELD_NAME) LIKE MAKT-MAKTX.
DATA: CREATE_DATE LIKE MCHA-ERSDA VALUE '19000101',
UPDATE_DATE LIKE MCHA-LAEDA VALUE '19000101'.
concatenate 'MAX(' create_name ')' into l_create_name separated by space.
concatenate 'MAX(' update_name ')' into l_update_name separated by space.
SELECT SINGLE (l_CREATE_FIELD_NAME)
INTO CREATE_DATE FROM (table_name).
SELECT SINGLE (l_updATE_FIELD_NAME)
INTO updATE_DATE FROM (table_name).
IF CREATE_DATE > UPDATE_DATE.
MAX_DATE = CREATE_DATE.
ELSE.
MAX_DATE = UPDATE_DATE.
ENDIF.
IF MAX_DATE = '19000101'.
MAX_DATE = SY-DATUM.
ENDIF.
If it still fails please post the latest abap code for us to check.
Similar Messages
-
Execute Dynamic SQL statement using procedure builder
i want to execute a dynamic SQL statment using procedure builder not using forms
because my statement depending on a variable table name
i know that i can do that from forms using
FORMS_DDL('SQL_STAT');
but i wanna to use the procedure builder
which function i should use and how?
please explain in example if you don't mind.
thanksHi,
You can very well use DBMS_SQL Package supplied by Oracle for doing this.
Search for DBMS_SQL in OTN. You will get all info regarding this.
Regards.
<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica">quote:</font><HR>Originally posted by itslul:
i want to execute a dynamic SQL statment using procedure builder not using forms
because my statement depending on a variable table name
i know that i can do that from forms using
FORMS_DDL('SQL_STAT');
but i wanna to use the procedure builder
which function i should use and how?
please explain in example if you don't mind.
thanks<HR></BLOCKQUOTE>
null -
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 -
Dataset query issues twice if the dataset is connected to matrix and used in multilookup function
hello everybody.
could not find any information if this is an intended behavior:
dataset query issues twice if the dataset is connected to matrix and used in multilookup function
parameters in both queries are the same
ssrs: 2008 r2, sharepoint 2010 integrated
sharepoint 2010: september 2014 cu
thanks in advance
Sergey VdovinHello, Wendy.
I prepared a very empty sample report for you to demonstrate the problem - with this report, i hope, there is no place to discuss the shrinking of time data retrieval.
There is one dataset, one parameter and one lookup function. The query is executed twice.
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
<AutoRefresh>0</AutoRefresh>
<DataSources>
<DataSource Name="DataSource1">
<DataSourceReference>http://t005/ProjectBICenter/DocLib/IntegrationDBVdovin.rsds</DataSourceReference>
<rd:SecurityType>None</rd:SecurityType>
<rd:DataSourceID>7e554344-d6c2-48a5-a7f4-1d24608cb4b5</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="DataSet1">
<Query>
<DataSourceName>DataSource1</DataSourceName>
<CommandText>select 1 as temp, '$' as tempname</CommandText>
<rd:UseGenericDesigner>true</rd:UseGenericDesigner>
</Query>
<Fields>
<Field Name="temp">
<DataField>temp</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
<Field Name="tempname">
<DataField>tempname</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
</Fields>
</DataSet>
</DataSets>
<ReportSections>
<ReportSection>
<Body>
<ReportItems>
<Textbox Name="ReportTitle">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Lookup(1,Fields!temp.Value,Fields!tempname.Value,"DataSet1")</Value>
<Style>
<FontFamily>Verdana</FontFamily>
<FontSize>20pt</FontSize>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:WatermarkTextbox>Title</rd:WatermarkTextbox>
<rd:DefaultName>ReportTitle</rd:DefaultName>
<Top>0mm</Top>
<Height>10.16mm</Height>
<Width>139.7mm</Width>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</ReportItems>
<Height>57.15mm</Height>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</Body>
<Width>152.4mm</Width>
<Page>
<PageFooter>
<Height>11.43mm</Height>
<PrintOnFirstPage>true</PrintOnFirstPage>
<PrintOnLastPage>true</PrintOnLastPage>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</PageFooter>
<PageHeight>29.7cm</PageHeight>
<PageWidth>21cm</PageWidth>
<LeftMargin>2cm</LeftMargin>
<RightMargin>2cm</RightMargin>
<TopMargin>2cm</TopMargin>
<BottomMargin>2cm</BottomMargin>
<ColumnSpacing>0.13cm</ColumnSpacing>
<Style />
</Page>
</ReportSection>
</ReportSections>
<ReportParameters>
<ReportParameter Name="ReportParameter1">
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>1</Value>
</Values>
</DefaultValue>
<Prompt>ReportParameter1</Prompt>
<ValidValues>
<DataSetReference>
<DataSetName>DataSet1</DataSetName>
<ValueField>temp</ValueField>
<LabelField>tempname</LabelField>
</DataSetReference>
</ValidValues>
</ReportParameter>
</ReportParameters>
<rd:ReportUnitType>Mm</rd:ReportUnitType>
<rd:ReportServerUrl>http://t005/ProjectBICenter</rd:ReportServerUrl>
<rd:ReportID>cd1262ef-eca7-4739-a2ce-d3ca832d5cd6</rd:ReportID>
</Report>
Sergey Vdovin -
I have the following scenario:
User Scott has two tables named USERINFO and EMP with the following description:
desc USERINFO
schema varchar2(30)
desc EMP
ename varchar2(30)
empno number(4)
User Blake has one table named EMP which looks like:
desc EMP
ename varchar2(30)
I want to write a function which would copy the values from Scott's EMP table to Blake's EMP table but I want to get the user Blake's name from USERINFO's schema column. I figured I'd have to use dynamic SQL but am getting some errors when I execute the function. It compiles fine. Below is the code
CREATE OR REPLACE FUNCTION CopyInfo()
RETURN VARCHAR2 AS
name VARCHAR22(30);
target_schema VARCHAR2(30);
ret_str CHAR := NULL;
BEGIN
SELECT schema INTO target_schema FROM version;
SELECT ename INTO name FROM scott.emp WHERE empno = 7902;
DECLARE
sqlStmt VARCHAR2(1028);
BEGIN
sqlStmt := 'INSERT INTO ' || target_schema || '.emp VALUES( name )';
execute SqlStmt ;
END;
ret_str := 't';
RETURN ret_str;
END CopyInfo
When I create the function, it comes back with -
Function created.
when I try to execute I get an error as shown below:
SQL>BEGIN
2 DBMS_OUTPUT.PUT_LINE( CopyInfo());
3 END;
4 /
ERROR at line 1:
ORA-00984: column not allowed here
ORA-06512: at "SCOTT.COPYINFO", line 13
ORA-06512: at line 2
Any idea, how to fix this ??? Thanks a lot....---Sorry I meant userinfo not version in the code----
I have the following scenario:
User Scott has two tables named USERINFO and EMP with the following description:
desc USERINFO
schema varchar2(30)
desc EMP
ename varchar2(30)
empno number(4)
User Blake has one table named EMP which looks like:
desc EMP
ename varchar2(30)
I want to write a function which would copy the values from Scott's EMP table to Blake's EMP table but I want to get the user Blake's name from USERINFO's schema column. I figured I'd have to use dynamic SQL but am getting some errors when I execute the function. It compiles fine. Below is the code
CREATE OR REPLACE FUNCTION CopyInfo()
RETURN VARCHAR2 AS
name VARCHAR22(30);
target_schema VARCHAR2(30);
ret_str CHAR := NULL;
BEGIN
SELECT schema INTO target_schema FROM userinfo;
SELECT ename INTO name FROM scott.emp WHERE empno = 7902;
DECLARE
sqlStmt VARCHAR2(1028);
BEGIN
sqlStmt := 'INSERT INTO ' || target_schema || '.emp VALUES( name )';
execute SqlStmt ;
END;
ret_str := 't';
RETURN ret_str;
END CopyInfo
When I create the function, it comes back with -
Function created.
when I try to execute I get an error as shown below:
SQL>BEGIN
2 DBMS_OUTPUT.PUT_LINE( CopyInfo());
3 END;
4 /
ERROR at line 1:
ORA-00984: column not allowed here
ORA-06512: at "SCOTT.COPYINFO", line 13
ORA-06512: at line 2
Any idea, how to fix this ??? Thanks a lot.... -
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 -
Is there a solution for dynamic reports and using Denes' Export to Excel?
Oracle 10.2.0.4.0
Application Express 3.2.1.00.10
Hello all!
I am using Denes Kubicek's Export_Excel_Pkg in my application and I'm having trouble exporting reports based on report regions created using a PL/SQL function body returning SQL query. I realize this is not an Oracle supported package, but was hoping someone here could shed some light on it. When I open up the Excel file, I get an error such as: Report Values Error: ORA-06550: line 22, column 5: PL/SQL: ORA-00907: missing right parenthesis.
I've searched the forum and already have done as others suggested by modifying the REPLACE on the v_sql variable in Export_Excel_Pkg.Get_Usable_SQL, but it did not work. My assumption is that there is an issue with the value being passed to the wwv_flow_utilities.get_binds function. I could not find documentation on this function, but I'm thinking that it cannot extract the bind variables within a PL/SQL block. The report only works when I have just use SQL with bind variables...doesn't work for PL/SQL. Nor does it work for dynamic SQL reports that use a "lexical" parameter (e.g. using WHERE &p_and_condition.) to build the WHERE clause.
Has anyone come up with a work-around to this? I somehow need to be able to extract reports based on dynamic SQL (or PL/SQL) to Excel.
Help is appreciated!
This is my example of a report based on PL/SQL function:
DECLARE
v_sql VARCHAR2(4000);
BEGIN
v_sql := q'[SELECT UPPER(t1.olo_name) agency_title,
t1.class_code,
UPPER(t1.class_title) class_title,
t1.pay_plan,
t1.pay_grade_code,
COUNT(t1.appt_fte) total_employees,
SUM(t1.appt_fte) filled_fte,
AVG(DECODE(t2.pay_cycle_code,
'UB',((t1.wage_type1_amt_for_pay * 26)/t1.appt_fte),
'UM',((t1.wage_type1_amt_for_pay * 12)/t1.appt_fte),
0)) avg_annual_rate
FROM my_schema.table1 t1,
my_schema.table2 t2,
my_schema.table3 pro
WHERE t1.pos_wk = t2.pos_wk
AND t2.pos_rate_active_flag = 'Y'
AND t1.ops_ind = 'N'
AND t1.employee_type IN ('1','2')
AND pro.ROLE_CODE = :F101_DW_ROLE
AND pro.pos_role_orgs_active_flag = 'Y']';
IF :P_MULTI_OLO IS NOT NULL THEN
v_sql := v_sql || q'[ AND INSTR(':'||']' || v('P_MULTI_OLO') || q'['||':', ':'||t1.olo_code||':') > 0]';
END IF;
v_sql := v_sql || q'[GROUP BY UPPER(t1.olo_name), t1.class_code, UPPER(t1.class_title), t1.pay_plan, t1.pay_grade_code ORDER BY t1.class_code ASC, avg_annual_rate]';
RETURN v_sql;
END;This is my example using a SQL statement with a lexical parameter:
SELECT UPPER(t1.olo_name) agency_title,
t1.class_code,
UPPER(t1.class_title) class_title,
t1.pay_plan,
t1.pay_grade_code,
COUNT(t1.appt_fte) total_employees,
SUM(t1.appt_fte) filled_fte,
AVG(DECODE(t2.pay_cycle_code,
'UB',((t1.wage_type1_amt_for_pay * 26)/t1.appt_fte),
'UM',((t1.wage_type1_amt_for_pay * 12)/t1.appt_fte),
0)) avg_annual_rate
FROM my_schema.table1 t1,
my_schema.table2 t2,
my_schema.table3 pro
WHERE t1.pos_wk = t2.pos_wk
AND t2.pos_rate_active_flag = 'Y'
AND t1.ops_ind = 'N'
AND t1.employee_type IN ('1','2')
AND pro.ROLE_CODE = :F101_DW_ROLE
AND pro.pos_role_orgs_active_flag = 'Y'
&P63_AND_CONDITION.
GROUP BY UPPER(t1.olo_name),
t1.class_code,
UPPER(t1.class_title),
t1.pay_plan,
t1.pay_grade_code
ORDER BY t1.class_code ASC, avg_annual_rateThe *&P63_AND_CONDITION.* value is populated based on a "Before Header" computation under Page Rendering, using the logic below. It is then used by the SQL query defined in the reports region at run time.
DECLARE
v_sql VARCHAR2(4000) := NULL;
BEGIN
v_sql := ' ';
IF :P_MULTI_OLO IS NOT NULL THEN
v_sql := v_sql || q'[ AND INSTR(':'||']' || v('P_MULTI_OLO') || q'['||':', ':' || t1.olo_code || ':') > 0]';
END IF;
RETURN v_sql;
END;Did you get an answer for this?
-
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 IN CLAUSE from Pro C code
Hi Guys,
Tyring to embed sql in Pro C. Here I don't know in hand how many items will be there in the IN Clause of my dynamic sql. Tried this with a loop and then adding actual values to the stement and then executing it. This worked but as this hard coding makes it literal sql and hence hampers performance. Can any one help me with how to put bind variables where we don't know how many of them will be there in a dynamic sql.
Thanks,Dynamic SQL supports user defined types, try passing a collection and using TABLE(CAST(collection)) in the SQL statement.
In the current approach (creating IN clause at runtime) keep in mind that in a IN clause you can put a maximum of 255 elements...
Max -
Dynamic SQL and PL/SQL Gateway
This question is kind of out of curiosity...I had created a procedure that used some dynamic sql (execute immediate), and was trying to use it on pl/sql gateway. I kept getting page not found errors until I removed the execute immediate statement, and reverted to using static sql statements.
I am just curious, is dynamic sql not supported at all with pl/sql gateway?
Thanks
Kevin> Relax damorgan, no need to be condescending. Of course I read the docs ..
Well, you're one of the few that actually read the docs.. And one of many that lacked to state any real technical details for forum members to understand the actual problem, the actual error, and what the environment is that this is happening in.
Remember that you came to this forum for forum members to help you. In order for us to do that, you need to help us understand
- your problem
- your environment
- what you have tried
What PL/SQL Gateway do you refer to? Thus is an old term for an old product - today in Oracle there are two "gateways" into the PL/SQL engine via HTTP. Via Apache/mod_plsql and via the internal Java servlet web engine called EPG inside Oracle.
As for what the "Gateway" access to the PL/SQL engine via HTTP.. whether it supports EXECUTE IMMEDIATE or not is like asking if a car "supports" soft drinks or not (just because a human that may consume soft drinks acts as the driver of the car). Not sensible or relevant at all.
mod_plsql creates an Oracle session to the database instance, and executes a PL/SQL procedure in the database. This is no different from any other client connection to Oracle. Oracle has no clue that the client is mod_plsql and not TOAD or Java or VB or PHP or Perl or whatever else.
So how can this support or not support the EXECUTE IMMEDIATE command? Does PL/SQL support EXECUTE IMMEDIATE? Well duh...
Why do you get a generic 404? Because the PL/SQL call made by mod_plsql failed with an unhandled exception. mod_plsql gets that exception and now what? Was a valid HTP buffer created for it to stream to the web browser? If the buffer perhaps partially completed? All that mod_plsql knows is that it asked for a HTP buffer via that PL/SQL call and it got an exception in return.
A 404 HTTP error is the only reasonable and logical response for it to pass to the web browser in this case.
PS. to see why mod_plsql fail, refer to the access_log and error_log of that Apache httpd server -
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 possibleOK,
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
Maybe you are looking for
-
I have a particular microphone that is about 8-0 inches in length...it sits on a very small stand, and just plugs into the back of the PC where the mic jack is. I think it is to be used with a web cam, so people can hear the person on the other side
-
Installed ssd on new macbook but getting a grey folder with a question mark?
Hi, I bought a new macbook pro, late 2011. Installed aftermarket SSD myself. Switched mac on and i get a question mark in a grey folder with a white background. I rang Apple and they said they mac cannot find the operating system. Any help?
-
Find function and spotlight - some reactions
Hi, I just got at new iMac and I'm trying to get hip to what's what with Leopard. I hit a glitch when it came time to look for a file on the hard drive. Is it me or is the find function almost useless? (I've given up on Spotlight.) When I select File
-
Safari won't let me open the bill pay section of my bank
I have tried to pay bills on line with two different banks. Neither one will allow me to open the 'BILL PAY' tab so I can do that. This just recently happened. I have been paying bills this way for over a year. Neither bank knows what the problem
-
Need help re-synching iPods with new computer and getting iTunes to...
Need help re-synching iPods with new computer and getting iTunes to recognize our iPods (it doesn't even recognize them when they're plugged in). Hubby wiped my harddrive for me, so now I need to get everything back in proper places. I'm using window