Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations derfloh on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Dynamic PL/SQL

Status
Not open for further replies.

josephtauro

Programmer
Joined
May 14, 2001
Messages
5
Hi All,
This is my code for the Dynamic PL/SQL.The Problem in the code comes at the PARSE Statement.It gives an error saying
Error ORA -00936 misssing expression.I have a stong feeling that it has some error in the last UNION statement of the select query(may be at the line 'HisBenchmark').Please send me your suggestions.
PROCEDURE sp_PLSQL (ID1 IN varchar,ID2 IN varchar,ID3 IN varchar,ID4 IN varchar,StartDate IN varchar,EndDate IN varchar,DarArt IN NUMBER)
IS
--Fonds-Variablen
v_FID1 Number;
v_FID2 Number;
v_FID3 Number;
v_FID4 Number;
-- Variable für den HisBenchmark
v_HID1 Number;
-- Variablen für die Benchmarks
v_BID2 Number;
v_BID3 Number;
v_BID4 Number;
-- Variablen für den ersten Wert der Zeitreihe
-- Wird bei der Berechnung auf Prozentbasis oder logarithmisch benötigt
v_FV_FID1 Number;
v_FV_FID2 Number;
v_FV_FID3 Number;
v_FV_FID4 Number;
v_FV_BID2 Number;
v_FV_BID3 Number;
v_FV_BID4 Number;
v_FV_HID NUMBER;
-- Variablen für Start- und EndeDatum
v_Start Date;
v_Ende Date;
v_increment date;
-- Von der Art der Dartstellung hängt der Rückgabewert ab; Variable für die
-- Darstellungsart
v_DarArt Number;
--c bfDEKA_PROC_PLSQL_TEST2.ctype;
v_ID fonds.id%Type;
v_Name fonds.Name%Type;
v_Value dk_fondskennzahl.ruecknahmepreis%Type;
v_Datum dk_fondskennzahl.Datum%Type;
a varchar(10);
--Diff Number;
--i Number;
--v_insert Date;
v_CursorID Integer;
v_SelectStmt varchar2(10000);
v_Dummy Integer;

BEGIN
--Getting the Cursor Handler
v_CursorID:=DBMS_SQL.OPEN_CURSOR;
-- Die erste ID ist immer ein Fonds
v_FID1 := to_Number(SubStr(ID1,3));
-- Wenn der zweite Buchstabe der übergebenen ID ein H ist,
-- dann soll der Historische Benchmark angezeigt werden.
-- Sobald die v_HID1 nicht NULL ist, wird der HisBenchmark angezeigt
if (substr(ID1,2,1) = 'H') then
v_HID1 := to_Number(SubStr(ID1,3));
else
v_HID1 := null;
end if;
-- Handelt es sich bei der 2.ID um einen Fonds (F) oder ein Benchmark(B)
-- der zweite Buchstabe der ID kann ignoriert werden.
if (substr(ID2,1,1) = 'F') then
v_FID2 := to_Number(SubStr(ID2,3));
v_BID2 := null;
else
v_FID2 := null;
v_BID2 := to_Number(SubStr(ID2,3));
end if;
--Das gleiche auch noch für die 3. ...
if (substr(ID3,1,1) = 'F') then
v_FID3 := to_Number(SubStr(ID3,3));
v_BID3 := null;
else
v_FID3 := null;
v_BID3 := to_Number(SubStr(ID3,3));
end if;
-- ... und 4. ID
if (substr(ID4,1,1) = 'F') then
v_FID4 := to_Number(SubStr(ID4,3));
v_BID4 := null;
else
v_FID4 := null;
v_BID4 := to_Number(SubStr(ID4,3));
end if;
v_Start :=TO_DATE(StartDate,'DD/MM/YYYY');
v_Ende := TO_DATE(EndDate,'DD/MM/YYYY');
v_DarArt := DarArt;
-- Falls der Wert berechnet zurück gegeben werden soll (=> DarArt = 1 oder 2) , dann muß
-- der erste Wert der jeweiligen Zeitreihe ermittelt werden
if (v_DarArt != 0) then
v_FV_FID1 := BF_SELECT_FV_FONDS(v_FID1,v_Start); -- die erste Zeitreihe ist immer ein Fonds
-- ab der zweiten Zeitreihe muß untersucht werden, ob es ein Fonds oder eine Benchmark ist
if (substr(ID2,1,1) = 'F') then
v_FV_FID2 := BF_SELECT_FV_FONDS(v_FID2,v_Start);
v_FV_BID2 := null;
else
v_FV_FID2 := null;
v_FV_BID2 := BF_SELECT_FV_BENCHMARK(v_BID2,v_Start);
end if;
if (substr(ID3,1,1) = 'F') then
v_FV_FID3 := BF_SELECT_FV_FONDS(v_FID3,v_Start);
v_FV_BID3 := null;
else
v_FV_FID3 := null;
v_FV_BID3 := BF_SELECT_FV_BENCHMARK(v_BID3,v_Start);
end if;
if (substr(ID4,1,1) = 'F') then
v_FV_FID4 := BF_SELECT_FV_FONDS(v_FID4,v_Start);
v_FV_BID4 := null;
else
v_FV_FID4 := null;
v_FV_BID4 := BF_SELECT_FV_BENCHMARK(v_BID4,v_Start);
end if;
-- und zu guter Letzt: Falls der HisBench angezeigt werden soll, dann muß auch hier der
-- erste Wert berechnet werden
if (substr(ID1,2,1) = 'H') then
v_FV_HID := BF_SELECT_FV_HISBENCHMARK(v_HID1,v_Start);
else
v_FV_HID := null;
end if;
end if;
--Select Statement will be put into v_SelectStmt
v_SelectStmt:='Select distinct fonds.ID as ID,fonds.Name as Name,'
||'BFDEKA_PLSQL_BERECHNUNG((DK_Fondskennzahl.Ruecknahmepreis * DK_Fondskennzahl.Adjustierungsfaktor),Decode(fonds.id,:i,:a,:j,:b,:k,:c,:l,:d,0),:dart) as wert,'
||'DK_Fondskennzahl.Datum as Datum'
||' from fonds, DK_Fondskennzahl'
||' where fonds.ID = DK_Fondskennzahl.FondsID'
||' and fonds.Fondsstatusid = 1'
||' and fonds.ID IN ( :i, :j, :k, :l )'
||' and fonds.GueltigAb < :sta'
||' and fonds.Fondsauflegung < :sta'
||' and (DK_Fondskennzahl.Datum between :sta and :en)'
||' UNION'
||' Select distinct Benchmark.ID as ID,Benchmark.Name as Name,'
||' BFDEKA_PLSQL_BERECHNUNG(Benchmarkkurs.Wert, Decode(BenchmarkID,:e,:m,:f,:n,:g,:o,0),:dart)as wert,'
||' Benchmarkkurs.Datum as Datum'
||' from Benchmark, Benchmarkkurs'
||' where Benchmark.ID = Benchmarkkurs.BenchmarkID'
||' and Benchmark.ID IN (:m,:n,:o)'
||' and (Benchmarkkurs.Datum between :sta and :en)'
||' UNION'
||' Select DISTINCT fonds.ID as ID,'
||'(''Hisbenchmark'') as Name,'
||' BFDEKA_PLSQL_BERECHNUNG(HistBenchmarkKurs.Wert,:h,:dart) as wert,'
||' HistBenchmarkKurs.Datum as Datum,'
||' from fonds, HistBenchmarkKurs'
||' where fonds.ID = HistBenchmarkKurs.FondsID'
||' and fonds.ID = :p'
||' and (HistBenchmarkKurs.Datum between :sta and :en)';

--Parse the query(Error comes here)
DBMS_SQL.PARSE(v_CursorID,v_SelectStmt,DBMS_SQL.v7);
--Bind the variables with the Placeholders
DBMS_SQL.BIND_VARIABLE(v_CursorID,':i',v_FID1);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':j',v_FID2);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':k',v_FID3);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':l',v_FID4);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':m',v_BID2);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':n',v_BID3);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':o',v_BID4);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':p',v_HID1);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':a',v_FV_FID1);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':b',v_FV_FID2);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':c',v_FV_FID3);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':d',v_FV_FID4);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':e',v_FV_BID2);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':f',v_FV_BID3);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':g',v_FV_BID4);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':h',v_FV_HID);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':dart',v_DarArt);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':sta',v_Start);
DBMS_SQL.BIND_VARIABLE(v_CursorID,':en',v_Ende);

--Define the output variables
DBMS_SQL.DEFINE_COLUMN(v_CursorID,1,v_ID);
DBMS_SQL.DEFINE_COLUMN(v_CursorID,2,v_Name,30);
DBMS_SQL.DEFINE_COLUMN(v_CursorID,3,v_Value);
DBMS_SQL.DEFINE_COLUMN(v_CursorID,4,v_Datum);
--DBMS_SQL.DEFINE_COLUMN(v_CursorID,5,a,20);
--Execute the statement
v_dummy:=DBMS_SQL.EXECUTE(v_CursorID);
--This is the Fetch Loop
LOOP
IF DBMS_SQL.FETCH_ROWS(v_CursorID)=0 THEN
EXIT;
END IF;
--Retrieve the rows from the buffer into PL/SQL variables
DBMS_SQL.COLUMN_VALUE(v_CursorID,1,v_ID);
DBMS_SQL.COLUMN_VALUE(v_CursorID,2,v_Name);
DBMS_SQL.COLUMN_VALUE(v_CursorID,3,v_Value);
DBMS_SQL.COLUMN_VALUE(v_CursorID,4,v_Datum);
--DBMS_SQL.COLUMN_VALUE(v_CursorID,5,a);
--Show it on the screen
DBMS_OUTPUT.PUT_LINE(v_ID || ' ' || v_Name || ' ' || v_value || ' ' || v_Datum || ' '||a);
END LOOP;
--Close the cursor
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
END sp_PLSQL;
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top