Calling function in procedure...A tricky one
hi guys,
Here is a tricky thing ...
There is actually a Whole book which has Risk and XYZ portfolio books and other books as well.
The below procedure actually select the risk books based on FLAG =N else it will select all the books.
Now i need to modify this....
Here is a thing .....instead of selecting all the books it should select XYZ portfolio list.
Actually there is function in a package called PKG.TEST_func, This function lists all the books
Now all i need to do is call this function in the procedure in the else part and pass the parameter for XYZ portfolio books.
HOW DO I DO THIS????
create or replace procedure TEST
flg in varchar2 ,
cur_out out sys_refcursor
as
begin
if upper(flg) = 'N' then
open cur_out for
select distinct Book
from bookmgr.VW_book@bookmgr_dbln
where RISK_REP_FLG = 'N'
ORDER BY book;
Else
open cur_out for
select distinct Book
from bookmgr.VW_book@bookmgr_dbln;
end if;
end test;
Please let me know if u have any questions....
Thank you so much in Advance....I m kinda of newbe to this world. I appriciate you help..
thanks
-sunny
It will be something like ...
Else
cur_out :=PKG.TEST_func('XYZ portfolio list') ;
end if;Of course,m it is your system, so only you know the actually value of the parameter.
Cheers, APC
blog: http://radiofreetooting.blogspot.com
Similar Messages
-
Same algorithm in function and procedure then which one will better?
Why pl sql function is better to computes a value instead of procedure?
If I apply same algorithm in function and procedure then which one will perform better?It's not a matter of performance, it is more a matter of how it is going to be used.
A function can be used as an expression in an assignment or in a query.
my_var := my_func(my_param);
select my_var(my_col) from my_table;But it can just return a single value (which can be a complex value like a nested table or object or ref cursor, but still a single value.)
The procedure often is more used to perform an action that does not return anything.
execute_invoicing(my_invoice_id);Or procedures can be used if you need multiple return values.
my_proc(my_input, my_output_1, my_output_2, my_output_3);But the procedure cannot be used in an assignment expression or a select query.
Performance wise procedures and functions are completely identical. It is only a matter of what action they perform and how you are going to use them. -
Calling function from procedure
Hi,
I have a function validate_address which returns 'Y' or 'N' to say if the address is valid or not.
I need to call this function from a procedure - saying 'select records where the function returns 'N' (as part of the where clause)'
Could you help me with how to achieve this, please. Thanks,
Message was edited by:
user6773Create Or Replace Procedure procedure0001 As
vAddress Varchar2(200) := '1 Tech Drive, Silicon Valley, CA 94109';
vFlag Varchar2(5);
Begin
vFlag := validate_address(vAddress);
If vFlag = 'N' Then
End If;
End;
or
Create Or Replace Procedure procedure0001 As
vAddress Varchar2(200) := '1 Tech Drive, Silicon Valley, CA 94109';
vFlag Varchar2(5);
Begin
Select validate_address(vAddress)
Into vFlag
From Dual
Where validate_address(vAddress) = 'N'
End;
/ -
How to call a stored procedure with only one output parameter using toplink
Can anybody help me to get out of this exception. I have tried through several ways, but could not find the solution.
I have a following stored proc : -
CREATE OR REPLACE PROCEDURE spt_remove_duplicates_pr (outbuffer OUT VARCHAR2)
IS
buff VARCHAR2(32000) := ' ';
BEGIN
buff := ' Hi From Stored Proc' ;
outbuffer : = buff;
END;
When I am executing it using following code :-
StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("spt_remove_duplicates_pr");
call.addNamedOutputArgument("a","a",String.class);
ValueReadQuery query = new ValueReadQuery();
query.setCall(call);
String buff1 = (String) session.executeQuery(query);
I am getting the exception as : -
LOCAL EXCEPTION STACK:
EXCEPTION [TOPLINK-4002] (TopLink - 9.0.3.4 (Build 432)): oracle.toplink.exceptions.DatabaseException
EXCEPTION DESCRIPTION: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SPT_REMOVE_DUPLICATES_PR'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
INTERNAL EXCEPTION: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SPT_REMOVE_DUPLICATES_PR'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ERROR CODE: 6550
at oracle.toplink.exceptions.DatabaseException.sqlException(Unknown Source)
at oracle.toplink.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(Unknown Source)
at oracle.toplink.internal.databaseaccess.DatabasePlatform.executeStoredProcedureCall(Unknown Source)
at oracle.toplink.internal.databaseaccess.DatabaseAccessor.executeCall(Unknown Source)
at oracle.toplink.threetier.ServerSession.executeCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeSelectCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeSelect(Unknown Source)
at oracle.toplink.queryframework.DirectReadQuery.executeNonCursor(Unknown Source)
at oracle.toplink.queryframework.DataReadQuery.execute(Unknown Source)
at oracle.toplink.queryframework.ValueReadQuery.execute(Unknown Source)
at oracle.toplink.queryframework.DatabaseQuery.execute(Unknown Source)
at oracle.toplink.queryframework.ReadQuery.execute(Unknown Source)
at oracle.toplink.publicinterface.Session.internalExecuteQuery(Unknown Source)
at oracle.toplink.threetier.ServerSession.internalExecuteQuery(Unknown Source)
at oracle.toplink.publicinterface.Session.executeQuery(Unknown Source)
at oracle.toplink.publicinterface.Session.executeQuery(Unknown Source)
at com.marshmc.eta.reuse.persistent.PersistentService$DuplicateRemovalThread.run(Unknown Source)
INTERNAL EXCEPTION STACK:
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'SPT_REMOVE_DUPLICATES_PR'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:582)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1983)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1141)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2149)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2032)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2894)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
at oracle.toplink.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(Unknown Source)
at oracle.toplink.internal.databaseaccess.DatabasePlatform.executeStoredProcedureCall(Unknown Source)
at oracle.toplink.internal.databaseaccess.DatabaseAccessor.executeCall(Unknown Source)
at oracle.toplink.threetier.ServerSession.executeCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeSelectCall(Unknown Source)
at oracle.toplink.internal.queryframework.CallQueryMechanism.executeSelect(Unknown Source)
at oracle.toplink.queryframework.DirectReadQuery.executeNonCursor(Unknown Source)
at oracle.toplink.queryframework.DataReadQuery.execute(Unknown Source)
at oracle.toplink.queryframework.ValueReadQuery.execute(Unknown Source)
at oracle.toplink.queryframework.DatabaseQuery.execute(Unknown Source)
at oracle.toplink.queryframework.ReadQuery.execute(Unknown Source)
at oracle.toplink.publicinterface.Session.internalExecuteQuery(Unknown Source)
at oracle.toplink.threetier.ServerSession.internalExecuteQuery(Unknown Source)
at oracle.toplink.publicinterface.Session.executeQuery(Unknown Source)
at oracle.toplink.publicinterface.Session.executeQuery(Unknown Source)
at com.marshmc.eta.reuse.persistent.PersistentService$DuplicateRemovalThread.run(Unknown Source)I got the partial solution. The code is working now, however I am not getting the return value from stored proc.
The changed code is as :-
StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("spt_remove_duplicates_pr");
call.addNamedOutputArgument("outbuffer","outbuffer",StringBuffer.class);
ValueReadQuery query = new ValueReadQuery();
query.setCall(call);
StringBuffer buff1 = (StringBuffer) session.executeQuery(query);
System.err.println("Done ! Output is : " + buff1);
The result is :-
Done ! Output is : null
How can I get the output ? -
Calling a stored procedure from Reports
I am trying to call a stored procedure using oracle reports in the afterparameter code. My code is:
v_ain := sp_get_ain(:P_session_id);
Can someone help me out by telling what is wrong. I keep getting an error stating that sp_get_ain needs to be declared.?!I am creating a function and a stored procedure and calling them
in afterparameter report trigger.
-------------------Create function ----------------
create or replace function get_name( emp_id number) return varchar2 is
v_name varchar2(20);
begin
select name into v_name
from sample_table
where employ_id = emp_id ;
return(v_name); ---------This is the way to return value from function.
exception
when no_data_found then
return('Name not found.');
when others then
return('Other error found.');
end ;
==================================================================================
------------------------Create procedure ------------------------------------
create or replace procedure get_name( emp_id number, return_name out varchar2) is
v_name varchar2(20);
begin
select name into v_name
from sample_table
where employ_id = emp_id ;
return_name := v_name ; --Assign out parameter value from procedure.
exception
when no_data_found then
return_name := 'Name not found.';
when others then
return_name := 'Other error found.';
end ;
============================================================================
-----------------Call function and procedure from report ---------------------
In formula column or any report trigger you can use this code.
v_function_return_name varchar2(20);
v_procedure_return_name varchar2(20);
v_employ_id number(10);
begin
v_employ_id := 101 ;
v_function_return_name := get_name(v_employ_id ); --- call function
get_name(v_employ_id , v_procedure_return_name ); -- call procedure
end;
Here v_function_return_name has same value as v_procedure_return_name,
these are the values returned from function and procedure.
--Anita -
I want to call pl/sql procedure or function
hi i'm in need to create record in my table throgh ADF , so i called sequence from java class (create) . its working but one major problem is if i delete one record in table means , when i create new record it ll generate next value in sequence only, ya that is the concept of sequence. that's why i want to call sql function or procedure from java class. give the syntax to call.
San-717,
How about this (from Steve Muench and SRDemo)
public final static int NUMBER = Types.NUMERIC;
public final static int DATE = Types.DATE;
public final static int VARCHAR2 = Types.VARCHAR;
public final static int CHAR = Types.CHAR;
public final static int ARRAY = Types.ARRAY;
public final static int BOOLEAN = Types.BOOLEAN; /* this may be illegal??*/
public Object callStoredFunction(int sqlReturnType, String stmt,
Object[] bindVars,
String callableStatementString,
boolean pRunPreAndPostMethods) {
if (pRunPreAndPostMethods) {
runBeforeJDBCCall();
CallableStatement st = null;
try {
// 1. Create a JDBC CallabledStatement
st =
getDBTransaction().createCallableStatement(callableStatementString, 0);
// 2. Register the first bind variable for the return value
st.registerOutParameter(1, sqlReturnType);
if (bindVars != null) {
// 3. Loop over values for the bind variables passed in, if any
for (int z = 0; z < bindVars.length; z++) {
// 4. Set the value of user-supplied bind vars in the stmt
st.setObject(z + 2, bindVars[z]);
// 5. Set the value of user-supplied bind vars in the stmt
st.executeUpdate();
// 6. Return the value of the first bind variable
return st.getObject(1);
} catch (SQLException e) {
throw new JboException(e);
} finally {
if (st != null) {
try {
// 7. Close the statement
st.close();
} catch (SQLException e) {
e.printStackTrace();
if (pRunPreAndPostMethods) {
runAfterJDBCCall();
} -
How to Create a Procedure/Function to Return more than one value
How I can write a function/Procedure to which one value is passed and it will return nine values. How I can use these values
Syed,
I would use PL_SQL table versus a VARRAY for this purpose as you will have an advantage of joining PL_SQL table if you want to in your SQL statements in the procedure.
1. At the SQL prompt, create a type using,
create or replace type myTable as table of VARCHAR2(100);
2. Pass the table to your procedure as IN OUT parameter,
Create or replace procedure
myProc(pvar1 IN Number, passingArray IN OUT myTable) AS
Begin
--Fill the array with your logic
for i in 1..9
loop
passingArray.extend;
passingArray(passingArray.count) := 'what ever';
end loop;
End;
3. From your Main prog, you call Myproc
--declare a variable for type first
passingArray myTable := myTable();
begin
myProc(10, passingArray());
--At this point, You would be able to Join the PL_SQL table
--which gives you the power of using SQL with PL_SQL tables
end; -- end of main program
4. All done!I have not shown how to use PL_SQL tables in SELECT statements, as that is not the subject here.
At the end of the story, I would say, if you know the number of arguments that you are going to pass to a procedure, Simply use "that many" IN OUT parameters to finish your task(9 in your case). Although the proc call looks large with this, it is much simpler. The above approach is VERY helpful if YOU DO NOT KNOW THE NUMBER OF ARGUMENTS that you are sending AND receiving From a procedure.
Thx,
SriDHAR -
Need to call funtion in stored procedure to run one customized report
Hi,
I need to call one function in stored procedure for our customized report. Can anyone please help me in calling the function in stored procedure and provide the syntax for the same.
Thanks,
Kalpana.Either open an existing report. You'l see so many examples.
or
http://www.google.co.in/#hl=en&source=hp&biw=1024&bih=586&q=call+function+in+stored+procedure+sql&aq=1&aqi=g2g-m2&aql=&oq=Call+function+in+stored&gs_rfai=&fp=dbefe777997d3915 -
How to call pl/sql procedure/function from XML
Hi,
I have a requirement to call pl/sql function/procedure from the RTF template. How can I do this?Hi,
I have got the same requirement. We need to call the store PL/SQL procedure from the XML template to generate the fixedwidth files. Could you tell me if you are able to call PL/SQL procedure from XML template?
Thanks,
Ram -
Calling function in to procedure
how can i call a function in a procedure?
i m calculating average in function and i want to display that avg in dbms output of
procedure.how can i do that?u want to claculate the avg value for entire records
create a function with in parameter.
and call that function in procedure.in this case u have to use cursor
and call that function in loop.
regards -
Function and procedure call overhead in PL/SQL
( I come from a programming background - java/c++ etc and not much PL/SQL )
Im trying to get a feel of how much extra cycles are spent if something is wrapped inside a function or procedure. I mean will it become considerably inefficient if the logic is within a function as opposed to be directly inline ?I did some timings a few years ago and found procedure calls to be slightly more efficient than function calls, presumably due to the fact that functions must pass values back through the function invocation and procedures don't. This may have changed in more recent releases but you can check it yourself.
Set up a function and a procedure and use dbms_utility to get a starting and ending time marker (this will be the number of seconds from an arbitrary start point as microseconds; you will have to convert). Get a start time, loop through the calls a lot of times, get and end time, and subtract the end time from the start time.
The prevailing though is that use functions to return values and procedures to perform actions. You can use functions in SQL if written correctly but not procedures. -
Calling Oracle function and Procedure using OCCI with in C++ code
Could any body send me the sample code to create and execute Oracle function and Procedure using OCCI concept in C++?.
Edited by: 788634 on Aug 16, 2010 4:09 AMHi Vishnu,
Yes, sure, you can create a PL/SQL procedure, function, package, package body, etc. from within an OCCI application. I would say that, generally, this is not the sort of activity a typical client application would perform unless there is some initialization/installation processes that need to happen. In any case, here is a simple demo showing how to create a stand alone procedure (in a real application I would use a package and body) that returns a ref cursor. The ref cursor is just a simple select of two columns in the hr.countries sample table. Of course, there is no error handling, object orientation, etc. in this demo - I wanted to keep the code as short and as simple as possible to illustrate the concept.
Regards,
Mark
#include <occi.h>
#include <iostream>
using namespace std;
using namespace oracle::occi;
int main(void)
// occi variables
Environment *env;
Connection *con;
Statement *stmt;
ResultSet *rs;
// database connection information
string user = "hr";
string passwd = "hr";
string db = "orademo";
// sql to create the procedure which returns a ref cursor as out parameter
// should be run as hr sample user or in a schema that has select privilege
// on the hr.countries table and a synonym (countries) that points to the
// hr.countries table
string sqlCreate =
"create or replace procedure get_countries(p_rc out sys_refcursor) as "
"begin"
" open p_rc for"
" select country_id, country_name from countries order by country_name; "
"end;";
// pl/sql anonymous block to call the procedure
string sqlCall = "begin get_countries(:1); end;";
// create a default environment for this demo
env = Environment::createEnvironment(Environment::DEFAULT);
cout << endl;
// open the connection to the database
con = env->createConnection(user, passwd, db);
// display database version
cout << con->getServerVersion() << endl << endl;
// create statement object for creating procedure
stmt = con->createStatement(sqlCreate);
// create the procedure
stmt->executeUpdate();
// terminate the statement object
con->terminateStatement(stmt);
// now create new statement object to call procedure
stmt = con->createStatement(sqlCall);
// need to register the ref cursor output parameter
stmt->registerOutParam(1, OCCICURSOR);
// call the procedure through the anonymous block
stmt->executeUpdate();
// get the ref cursor as an occi resultset
rs = stmt->getCursor(1);
// loop through the result set
// and write the values to the console
while (rs->next())
cout << rs->getString(1) << ": " << rs->getString(2) << endl;
// close the result set after looping
stmt->closeResultSet(rs);
// terminate the statement object
con->terminateStatement(stmt);
// terminate the connection to the database
env->terminateConnection(con);
// terminate the environment
Environment::terminateEnvironment(env);
// use this as a prompt to keep the console window from
// closing when run interactively from the IDE
cout << endl << "ENTER to continue...";
cin.get();
return 0;
} -
Calling Oracle Functions and Procedures in Java
I've looked online for a blurb on using Oracle SQL functions and
procedures in Java, but I haven't found anything. Can someone
either give me a quick crash course on this, or point me to the
best source of information for this?From the SQLJ FAQ.
http://otn.oracle.com/tech/java/sqlj_jdbc/htdocs/faq.html#sqljplsql
Within your SQLJ statements, you can use PL/SQL anonymous blocks
and call PL/SQL stored procedures and stored functions, as in the
following examples: Anonymous
block:
#sql {
DECLARE
n NUMBER;
BEGIN
n := 1;
WHILE n <= 100 LOOP
INSERT INTO emp (empno) VALUES(2000 +
n);
n := n + 1;
END LOOP;
END
Stored procedure call (returns the maximum
deadline as an output parameter into an output host expression):
#sql { CALL MAX_DEADLINE(:out maxDeadline) };
Stored function call (returns the maximum
deadline as a function return into a result expression):
#sql maxDeadline = { VALUES(GET_MAX_DEADLINE)
Of course, you can also use JDBC code to achieve the same - the
standard JDBC escape sequences for stored function and procedure
calls are supported, using for example:
"{? = CALL GET_MAX_DEADLINE}"
or:
"{call MAX_DEADLINE(?)}"
and for the rest of the details, get that JDBC crash course... -
How to call procedure in which one formal parameter is associative array ty
how to call procedure in which one formal parameter is associative array type,
pls explain with eg.>
above code work fine but when i use case then it give error like
i identifier should be declare
& my code is as
CASE v_array(i)
WHEN 'A' THEN
insert into di_ivpn_report (ID, test_name, table_name, status, entity, proposition)
values (v_att_id, v_att_name, 'DI_'||v_array(i)||'_REPORT'||'_'||v_att_id,
v_status, v_ent_name, v_array(i));
WHEN 'B' THEN
insert into di_mpls_report (ID, test_name, table_name, status, entity, proposition)
values (v_att_id, v_att_name, 'DI_'||v_array(i)||'_REPORT'||'_'||v_att_id,
v_status, v_ent_name, v_array(i));
END CASE;
>
Then you have to use ordinary loop
PROCEDURE insert_update_***_array (TRANID IN VARCHAR2, ATT_NAME IN VARCHAR2, ENT_NAME VARCHAR2, v_array IN ***_array)
IS
v_tranid VARCHAR2(1);
v_att_name VARCHAR2(100) := ATT_NAME;
v_ent_name VARCHAR2(100) := ENT_NAME;
v_att_id VARCHAR2(6);
v_ent_id NUMBER;
v_status VARCHAR2(20) DEFAULT 'INACTIVE';
I NUMBER;
BEGIN
i := v_array.first;
while i is not null loop
CASE v_array(i)
WHEN 'A' THEN
insert into di_ivpn_report (ID, test_name, table_name, status, entity, proposition)
values (v_att_id, v_att_name, 'DI_'||v_array(i)||'_REPORT'||'_'||v_att_id,
v_status, v_ent_name, v_array(i));
WHEN 'B' THEN
insert into di_mpls_report (ID, test_name, table_name, status, entity, proposition)
values (v_att_id, v_att_name, 'DI_'||v_array(i)||'_REPORT'||'_'||v_att_id,
v_status, v_ent_name, v_array(i));
END CASE;
i := v_array.next(i);
end loop;
end; -
Calling Function/Procedure from HTML_DB
Hi,
I am new to HTML_DB,i didn't even have a look and feel of the tool.My doubt is "Whether it is possible to call a Function/Procedure from a HTML_DB application,If so where i can find relevant documents".
Please help me ASAP.
Thanks,
Siva.GHi Siva,
I assume you're talking about existing PL/SQL functions and procedures? The answer is yes you can call them easily.
There's a great deal of documentation on OTN regarding Apex, which I would advise you to have a look through to get a better feel for how to use Apex -
http://www.oracle.com/technology/products/database/application_express/index.html
The 2-Day developer document is particularly worth having a look through -
http://www.oracle.com/pls/db102/to_pdf?pathname=appdev.102%2Fb16376.pdf
Maybe you are looking for
-
Problems with share screen in lion
Hello I have had problems with share screen since i have installed Lion. I can't share screen even inside the Lan, between Macs and between Mac and Iphone. It's like Lion would had some port block in any hidden place. Anyone knows something about it?
-
In my family we have 3IPhones 4S, one IPhone5, one IPad3, one IPadMini and two IPad 4. Is it possible to use the same energieadapter for all of those ?
-
Hello, I have written this rec statement *WHEN REC(EXPRESSION=%VALUE%LOOKUP) *ENDWHEN the only thing is I need to multiply it by -1. How do I add the reverse sign of this result to the REC statement. or how do i add that in the statement? Thanks.
-
App Store indicates new update but unable to install
I am running OS X 10.9.2. The App Store app insists I have a new update available - Facetime 1.0.4. However, when I click onthe Update button I receive the message - "We could not complete your update. FaceTime can't be installed on "MyDiskName" b
-
Drop tablespace and recreate a new one!
Hello All, One of my database(oracle 10g, aix server ) has a tablespace called tools for xample. its size is nearly 16g, but current usage is around 170 mb only. So i want to resize the tablespace size to 2G So what i did is, took export of tools tab