Procedures vs. Functions - arguments OUT

I thought a procedure just did something whereas a function returned a value. Oracle says "Specify OUT to indicate that the procedure passes a value for this argument back to its calling environment after execution.", so does this mean a procedure can be like a function but can pass back more that one value?
Matt

Matt,
You can specify IN,OUT, IN OUT parameters in both:
In the Pl/Sql procedure and in the Pl/Sql function.
There is a limitation however.
As soon as you specify OUT or IN OUT parameter in the function, this function cannot be used in SELECT statement.
It can be still used inside PL/sql block ,procedure or other function.
From the practical programming point of view, there is very little reason to use
OUT and IN OUT parameters in the function
HTH
Thomas

Similar Messages

  • How to find out list of procedures and functions inside a package

    How I can find out the list of Procedures and Functions inside a Package.

    Look at ALL_PROCEDURES and ALL_ARGUMENTS.

  • How can I catch a resultset thrown out by PL/SQL procedure or function.

    hi,
    I want to write a program in java which receives a resultset
    from PL/SQL , how can I do that.
    I don't want to create the resultset by passing a simple sql
    statement, I want the sql statement to be executed in the
    procedure or function,
    which in turn returns a PL/SQL table of records, or refcursor,
    and capture it in the resultset.

    Here's a quick note on how I do it:
    1. RETURN a REF CURSOR from your PL/SQL function.
    2. In your Java program, you declare the return type from the
    Statement as OracleTypes.CURSOR.
    /* Prepare your PL/SQL function call here */
    CallableStatement mystatement = myconnection.prepareCall
    ( "BEGIN ? := myfunction( p_param => ? ); END;" );
    /* Register the Oracle REF CURSOR as the return type */
    mystatement.registerOutParameter(1, OracleTypes.CURSOR);
    /* Set any additional input parameters to your function */
    mystatement.setString(2, "Param value");
    3. When you fetch the cursor from your Statement, do getObject
    () and then cast the Object as a ResultSet e.g.:
    mystatement.execute);
    ResultSet rs = (ResultSet) mystatement.getObject(1);
    /* Now you can iterate through the ResultSet in the same way as
    for any other JDBC ResultSet */
    while (rset.next())
    /* Fetch the values from your REF CURSOR here */
    mystatement.close();
    There may be better ways to do this, but it works for me.
    Regards,
    Chris I've put in a few more details above. Sorry I can't copy in a
    whole chunk of code for you, but this should be enough to get
    you started. I would recommend the Wrox Press book on
    application programming with Oracle 8i, as it includes lots of
    examples of many different tools for Oracle 8i e.g. JDBC, EJB,
    BC4J, Portal, XML etc.
    Good luck,
    Chris

  • Differences between procedures and functions.

    a little confusing ..in differences between procedures and functions..
    1. Can a function return only single value?? cant we return multiple values?
    2. Can we use 'out' parameter and 'return' clause at a time in the same function
    thank you

    Hi,
    newbie wrote:
    a little confusing ..in differences between procedures and functions..
    1. Can a function return only single value?? cant we return multiple values?Yes, a function can only return a single value.
    If the return type is some kind of collection or data structure, then that 1 collection or data structure can, of course, actually contain many sep[arate values.
    If you want to return multiple values, use a PROCEDURE with multiple OUT arguments.  (Functions can have OUT arguments, too, but avoid defining functions with OUT arguments.  It can cause a lot of confusion.)
    2. Can we use 'out' parameter and 'return' clause at a time in the same functionSure, but don't take my word for it.  Try it and see.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

  • How to call a procedure with two arguments

    Hi,
    I have a procedure with two arguments, ie. myprocedure(p1 in number,p2 in number) to display a blob image.
    how can I call out this blob image in url.
    I tried http://127.0.0.1:7777/pls/apex/SCHEMA.myprocedure?p1=1&p2=2 , but it don't work..
    Thanks
    vincent

    Vincent,
    As long as you have been granted the ability to execute the procedure and there are no spaces in the url and you have not misspelled the parameter names then this looks right.
    Here is a link to a procedure to download a file which takes two parameters.
    http://mywebsite.com/pls/htmldev/schema.package.function.download_file?p_session_id=1221970786026206&p_seq_id=724
    Cheers,
    Tyson Jouglet

  • Stored procedure and function - return table type

    Hello again :)
    I have one simple question :) Maybe on this forum the question was asked, but I found only similar question and they didn't help me.
    It's possible return in Stored Function (with StoredProcedureFunction) as result return TABLE type? Or return table type with output parametr with Stored Procedure? Or instead of the table return the db object, but it is similar problem:)
    Now, I can using db types TABLES or DB OBJECTS as INPUT parameters with call stored functions or procedures, for example:
    I have this simple db object:
    create or replace type BUFFER_DATA_R as object( detail  VARCHAR2(4000 ))
    And this simple table:
    CREATE OR REPLACE TYPE BUFFER_DATA_T IS TABLE OF BUFFER_DATA_R
    I create simple domain class object:
    *public class DMBufferDataStruct {*
    public String bufferData;
    And I mapped in java with ObjectRelationalDataTypeDescriptor:
    ObjectRelationalDataTypeDescriptor descriptor = new ObjectRelationalDataTypeDescriptor();
    descriptor.setJavaClass(DMBufferDataStruct.class);
    descriptor.setTableName("BUFFER_DATA_T");
    descriptor.setStructureName("BUFFER_DATA_R");
    descriptor.setPrimaryKeyFieldName("DETAIL");
    descriptor.addFieldOrdering("DETAIL");
    descriptor.addDirectMapping("bufferData", "DETAIL");
    and join to server session ...
    Well, i using this doimain class object as input parametr wih stored procedure call:
    ObjectRelationalDatabaseField ordf = new ObjectRelationalDatabaseField("");
    ordf.setSqlType(Types.STRUCT);
    spCall.addNamedArgument(key, key,
    Types.ARRAY,
    "BUFFER_DATA_T",
    ordf);           
    query.addArgument(key);
    args.add(paramsInputs.get(key));
    in paramsInputs is Vector of DMBufferDataStruct...
    Well, this work fine!
    But I can not figure, how to return this table from output parameters of stored procedure or as a return value from stored function?
    Example of exceptions:
    The number of arguments provided to the query for execution does not match the number of arguments in the query definition. - return as output parameter
    PLS-00382: expression is of wrong type - used as result from stored function
    So, my question is: Is possible return this table type from stored procedure or function? And if YES, how can I set output argument for call?
    Thx advance!
    Sorry for my English! :)
    Best regards, KLD

    Your question is: what is faster PL/SQL or PL/SQL? And the answer is: it is PL/SQL of course!
    As a general rule, you use a function when you return exactly one result: a number or a string or (more complex) instance of an object type or REF CURSOR or PL/SQL collection.
    You use a procedure when:
    a) you just do the job and return no result
    b) you return multiple results - you can use multiple IN/OUT or OUT parameters
    Imagine you have to write a program unit that performs a partitioned table maintenance by adding a partition.
    You can implement this unit:
    a) if you want return a "status code" (0 on successful completion or non-zero in case of error) then you should use a function
    b) if you want no "status code" (in case of error an exception is raised that is handled outside of the program unit) then you should use a procedure
    c) if you want "status code", name of tablespace where a partition was created (assume you program is so complex that it can choose different tablespaces based on metadata and free space available) and free space in that tablespace after the creation of a new partition then you should use a procedure with 3 OUT parameters.
    But these are good programming practices that can be applied to (almost) any 3rd generation programming language, not only PL/SQL.

  • Use of Procedure and Functions in ADF BC

    Hi,
    In ADF 11g
    1. can I use oracle function and procedures ( having in and OUT parameters) to expose as service interface
    2. if yes , How can this be done. and what are the allowed data types as input to procedure/function and can be returned by procedure/function
    3. How the transaction control will be achieved using ADF BC service interface.
    E.g. one ADF BC creates orders in order details and second creates Order lines in Order lines table. Now if order is created successfully but line creation fails then I want order to be rolled back also.
    Thanks.

    google it out.
    How to get two out param which is used in Procedure
    http://sameh-nassar.blogspot.in/2010/01/create-plsql-function-and-call-it-from.html
    http://adf-tools.blogspot.in/2010/09/adf-function-call-from-el-statement-in.html
    http://adf-tools.blogspot.in/2010/03/adf-plsql-procedure-or-function-call.html
    http://adfhowto.blogspot.in/2010/11/call-db-procedure-or-function-from-adf.html
    Re: use of Procedure and Functions in ADF BC

  • Error while using DB Adapter in BPEL[Calling a procedure or function]

    Hi
    I am getting Error while executing the BPEL Process.
    1) I created a BPEL Process which uses a DB Adapter. I am using call a procedure or function. My Procedure is shown below. It takes a string a s input parameter and executes that string. I have used an assign activity to assign the input string.
    Procedure
    create or replace
    PROCEDURE SP_QUERY(s_string in varchar2)
    AS
    l_sql_stmt varchar2(1000);
    BEGIN
    l_sql_stmt := s_string;
    -- dbms_output.put_line( l_sql_stmt );
    EXECute immediate l_sql_stmt;
    commit;
    dbms_output.put_line('Executed' );
    -- if SQLCODE = 0 then
    --retCodeString := 'OK';
    --end if;
    END;
    I gave input string as "select * from tab", I have also tried a insert statement to a table in which its present in this database. But i am getting the following error.
    <3 Jun, 2013 9:42:25 AM IST> <Error> <oracle.webservices.service> <OWS-04115>
    Whats the Issue? Is the issue with the procedure or the BPEL process? Please help me out. I am stuck in this

    Hi,
    According to your message you have selected your procedure, but looks like the procedure is not having any reply or response parameter with it.
    Have you executed the procedure separately from SQL editor and see whether you are able to get the response or not ?
    If you get response, then how many columns are you getting ?
    Check the column names are matching with the schema file generated by adapter and see whether those column names are available as elements in .xsd file.
    Example provided below..
    In the below link, check the section "9.7 Stored Procedure and Function Support"
    http://docs.oracle.com/cd/E23943_01/integration.1111/e10231/adptr_db.htm#CHDFBBCD
    Thanks,
    Vijay

  • Can we call a procedure within function?

    Can we call a procedure in function?
    If yes, then please explain with example.
    Thanks
    Aman

    Why don't you try it?
    SQL> set serveroutput on
    SQL> declare
      2   procedure p1 (
      3    i1 in out number
      4   )
      5   as
      6   begin
      7    i1 := 200;
      8   end p1;
      9   function f1
    10   return number
    11   is
    12    l1 number;
    13   begin
    14    p1(l1);
    15    return l1;
    16   end f1;
    17  begin
    18   dbms_output.put_line(f1);
    19  end;
    20  /
    200
    PL/SQL procedure successfully completed.
    SQL> set serveroutput off

  • Java Stored Procedure via Function Give 0RA 600 from SQL Workshop and App

    Hi,
    Anyone experienced stored procedures or functions failing when called from APEX app or SQL Workshop ( ora 600 ) yet they work fine when called from SQLPlus?
    Sqlplus connected as my apex workspace schema owner:
    select net_services.test_db_connection_via_ldap(
    'APEXPRD1', 'test1', 'test1', null ) as result from dual;
    RESULT
    The database connection attempt was SUCCESSFUL
    From Apex Sql Worshop:
    select net_services.test_db_connection_via_ldap(
    'APEXPRD1', 'test1', 'test1', null ) as result from dual;
    ORA-00600: internal error code, arguments: [16371], [0x434B08150], [0], [], [], [], [], [], [], [], [], []
    NOTE: Same result when run in response to button push on page in application.
    Apex Version: 3.2.1.00.10
    Oracle Version: 11.1.0.7.0
    NOTE: I am using the embedded plsql gateway; was going to try NOT using it to see if it was shared server related (seemed to be from trc files)
    Any ideas?
    Since the code works from sqlplus, I know that it's good: Here some snippets
    -- ========================================================================================
    public class NetServices extends Object {
    public static String doTestDbConnectionViaLdap
    String piDbConnUrl,
    String piUserName,
    String piUserPassword
         String vResult = null;
    try
         Connection conn = null;
         OracleDataSource ods = new OracleDataSource();
         ods.setUser( piUserName );
         ods.setPassword( piUserPassword );
         ods.setURL( piDbConnUrl );
         conn = ods.getConnection();
         conn.close();
         vResult = "The database connection attempt was SUCCESSFUL";
    } catch ( SQLException e )
         int vErrCode = e.getErrorCode();
         String vErrMsg = e.toString();
              if ( vErrCode == 1017 ) {
              vResult = "The database connection attempt FAILED! Incorrect Username or Password";
         } else if ( vErrCode == 17433 ) { // Null Username or Password
              vResult = "The database connection attempt FAILED! You must provide both a Username and a Password";
         } else if ( vErrCode == 17002 ) {
              vResult = "The database connection attempt FAILED! Net Service Name was Not Found";
         } else if ( vErrCode == 17067 ) { // NULL Net Service Name
              vResult = "The database connection attempt FAILED! You must provide a Net Service Name";
         } else {
              vResult = "The database connection attempt FAILED! Error " + vErrCode;
    return vResult;
    } // method: doTestDbConnectionViaLdap
    -- ========================================================================================
    function do_test_db_connection_via_ldap
    pi_db_conn_url IN VARCHAR2,
    pi_user_name IN VARCHAR2,
    pi_user_password IN VARCHAR2
    return VARCHAR2
    is -- PRIVATE to the net_services package
    language java -- NOTE: See cr_java_class_NetServices.sql for actual java implementation
    name 'NetServices.doTestDbConnectionViaLdap
    ( java.lang.String, java.lang.String, java.lang.String ) return java.lang.String ';
    -- ========================================================================================
    function test_db_connection_via_ldap
    pi_net_service_name IN VARCHAR2,
    pi_user_name IN VARCHAR2,
    pi_user_password IN VARCHAR2,
    pi_search_base IN VARCHAR2
    return VARCHAR2
    is -- PUBLIC procedure
    v_url      VARCHAR2(256);
    begin
    g_err_source := 'NET_SERVICES.test_db_connection_via_ldap';
    g_err_action := 'build_jdbc_conn_url_using_oid';
    /*     NOTE: We don't want to assert the parameters because we don't want to raise
    an exception;
    -- Get the jdbc connection url that uses oid info
    v_url := build_jdbc_conn_url_using_oid( pi_net_service_name, pi_search_base );
    return( do_test_db_connection_via_ldap( v_url, pi_user_name, pi_user_password ) );
    end test_db_connection_via_ldap;
    -- ========================================================================================
    Thanks in advance for your consideration.
    Troy

    Troy:
    You could be right in your guess that the error is related to MTS. Search Metalink for '16371'. Why not switch your APEX app to use OHS and test whether the error persists. ?
    varad

  • Procedure and Functions from ADF View Layer

    Hi,
    Before i ask my question ,I would like to mention that I have done lot of googling on this topic before asking this question.
    http://adfhowto.blogspot.in/2010/11/call-db-procedure-or-function-from-adf.html
    http://adf-tools.blogspot.ca/2010/03/adf-plsql-procedure-or-function-call.html
    Lot of threads on otn forum too on this topic.
    I m pretty new to ADf too.
    Now most of our logic is in procedures and functions ,so on various events on form(view layer) I need to call procedure and function and then return values back to value layer too.
    Now the approach mentioned in the link above is good whats best approach to return out parameters to view layer considering i will be using either the DbCall class for all calls to procedures and functions
    I am thinking of this approach to Create a view with static fields,and in Model layer set values for these fields and access them in view layer or binding view controls to these fields.
    From View layer i will call the methods in AppmodImpl which will be calling procedure( methods will be exposed as Client Interface)
    Also in few articles i came across generic CallStoredProcedure and CallStoredFunctions.
    But my main concern is how to share out parameters with view layer....can anyone give link of showing application of it on view layer.
    Regards,

    From your subject. am stating that, dont do all those stuff in backing bean. backing bean is 1:1 mapping with your .jpsx or .jsff .
    best approach would be call those things your Application Module(model layer) exposed it. access the method over your pagedef. well said by ram.

  • Procedure and function

    hi folks,
               procedure and function are doing a same job then why we using function,please give explanation in real time scenario ...

    When talking about PL/SQL only, everything that can be achieved with a function can also be achieved with a procedure using out parameters, thus you don't really need functions.
    However, a function may be used as a "syntactical convenience" in that you can write expressions like this in your PL/SQL code:
    total_salary := get_total_salary(dept_id => my_dept);
    (assuming you have defined the function get_total_salary).
    You may find this more readable than writing
    get_total_salary(result => total_salary, dept_id => my_dept);
    (assuming you have defined the procedure get_total_salary with an out parameter result).
    This is the same as with e.g. the CASE statement. You don't really need it, every CASE statement might be expressed with IF .. THEN statements as well. However using CASE may be more convenient and make your code more readable. Another example are loops, where you have different flavours, while everything might be expressed using one sort of loops (e.g. WHILE).
    In addition, you may use functions in SQL, while this is not possible with procedures, i.e. after defining some function f, you may write SQL like this:
    select * from t where f(id) = 0;

  • Procedure and Function-Memory issue

    Hi,
    I have got code for maintaining cube.This code is generated by AWM while maintaining cube.This is nothing but the PL/SQL block with generated SQLs using following package and procedure.
    dbms_lob.writeappend
    I am running this PL/SQL block by putting in procedure.It is working perfectly in procedure but due to system requirement I need to turn procedure into function.When I run the same PL/SQL block in function,it gives following error:
    ORA-29532: Java call terminated by uncaught Java exception:
    java.lang.OutOfMemoryError
    What is the difference between function and procedure when same set of SQLs are running successfully in procedure and giving error in function.
    Can someone help me in this?
    Thanks

    When talking about PL/SQL only, everything that can be achieved with a function can also be achieved with a procedure using out parameters, thus you don't really need functions.
    However, a function may be used as a "syntactical convenience" in that you can write expressions like this in your PL/SQL code:
    total_salary := get_total_salary(dept_id => my_dept);
    (assuming you have defined the function get_total_salary).
    You may find this more readable than writing
    get_total_salary(result => total_salary, dept_id => my_dept);
    (assuming you have defined the procedure get_total_salary with an out parameter result).
    This is the same as with e.g. the CASE statement. You don't really need it, every CASE statement might be expressed with IF .. THEN statements as well. However using CASE may be more convenient and make your code more readable. Another example are loops, where you have different flavours, while everything might be expressed using one sort of loops (e.g. WHILE).
    In addition, you may use functions in SQL, while this is not possible with procedures, i.e. after defining some function f, you may write SQL like this:
    select * from t where f(id) = 0;

  • Using variables for function arguments AS2

      Hello,
    I am trying to create a function in AS2.
    After creating the function, I want to use values stored in variables for the function arguments rather than manually typing static values for carrying out the function calculation. Also, I want to use the function to assign a new value to the existing variable.
    I have asked a similar question 2 days ago here and got the answer (thank you), but now I got one more question - How can I create the function to assign a value to the variable while that variable itself is also a function argument?
    For example, I have 6 numeric variables:
    var CoinA:Number = 10;
    var CoinB:Number = 20;
    var CoinC:Number;
    var CoinD:Number = 30;
    var CoinE:Number = 40;
    var CoinF:Number;
    Then I tried to create a function to assign values to variables CoinC and CoinF:
    function CalculationA(FirstCoin, SecondCoin, ThirdCoin):Void {
         FirstCoin = SecondCoin + ThirdCoin;
    CalculationA(CoinC, CoinA, CoinB);
    CalculationA(CoinF, CoinE, CoinF);
    The above code didn't really assign the values 30 and 70 to the variables CoinC and CoinF but instead, values of CoinC and CoinF are undefined.
    Please give me the correct code if there's a correct way of doing this.
    Thank you,

    Here is one way of doing it, by passing a string value of the variable name instead of the actual variable name....
    var CoinA:Number = 10;
    var CoinB:Number = 20;
    var CoinC:Number;
    var CoinD:Number = 30;
    var CoinE:Number = 40;
    var CoinF:Number;
    function CalculationA(FirstCoin, SecondCoin, ThirdCoin):Void {
         this[FirstCoin] = SecondCoin + ThirdCoin;
    CalculationA("CoinC", CoinA, CoinB);
    CalculationA("CoinF", CoinD, CoinE);
    (Note that in your second function call I changed the coins since CoinF (ThirdCoin) is undefined at that point.)

  • How to find how much memory used by particular procedure or function.

    Hi,
    How can we find out memory used by particular procedure or function?
    If procedure or function is called many times in particular interver, wil it be cached in memory?
    and how will it affect performance?
    what type of pl/sql statement will take more time than normal sql statement?

    Hi
    There are several different memory issues to consider:
    - the code itself (stored in the shared pool)
    - simple variables defined in the code
    - complex variables (eg VARRAY, TABLE etc)
    There's a helpful note on PL/SQL profiling here - http://www.oratechinfo.co.uk/tuning.html - which mentions how to measure memory use (session PGA and UGA - that's program and user global areas)
    You can find out more about shared pool memory structures here - http://download-east.oracle.com/oowsf2005/003wp.pdf.
    Calling a function many times - yes, the function code will be cached (if possible). Session state (for a package) will also be retained (ie global package variables).
    If many users call the same function, there will be one copy of the code but many copies of the private state.
    Finally: PL/SQL statements that can take a long time include:
    - anything that does heavy processing inside a tight loop;
    - anything that waits (select for update; read from a pipe or dequeue from AQ etc)
    Probably the most common mistake is to use PL/SQL for relational processing that can be done from SQL itself (eg writing nested PL/SQL loops to join data that could have been queried in a single SQL statement. Try to minimise context switches between PL/SQL and SQL:
    - use bulk collect where possible
    - use set operations in SQL
    Good luck, HTH
    Regards Nigel

Maybe you are looking for

  • Creation of Data Element

    Hi, I am working on special project of Automation of all utility billing and housing system for a big company in SAP. For that I have to create 26 tables and obviously I am creating a lot of dataelements. Now the problem is my quality dept says that

  • How can I set an validity date for a given vendor?

    Hello, we are currently trying to set a "validity date" for vendors. Basically, our vendors need to be audited, and are "accepted" for a period of time, beyond which we'd need to re-audit them. What we'd like the system to do is block use of the vend

  • I keep gettin sign in prompts for iCloud since I updated to Yosemite

    I keep getting sign in prompts for iCloud since I updated to Yosemite.  I repeatedly get them for Face Time and iMessage also. Haven't found any way to stop them.  I click cancel on every one and then they show up again about 5 seconds later. I final

  • DW CS3 Fonts display incorrectly

    Hello All, I just upgraded to DW CS3 and any page with paragraphs with font size sets to "2" displays as about a 4 pt font on the screen and is barley readable. Anyone have any ideas on how to get DW to display fonts correctly? Thanks for the help!

  • Turbo bost in MacBook Pro 15 Retina Display

    How?