Is it possible to invoke a variable procedure name?

Is it possible - within a trigger or elsewhere - to invoke a stored procedure by using a variable containing the name of the procedure?
I would like to be able to use a different procedure depending upon the value in a column of the table to which a row is inserted.
If this is not possible, is there an elegant way to allow for the inclusion of as-yet-unknown record types, which I was hoping to be able to handle simply by adding a new procedure, with the new record type suffixed to its core name. Each such variation would perform some type-specific calculation before invoking a common procedure to do the standard processing.
I feel it ought to be possible but can find no example anywhere in the documentation of a procedure being invoked by anything other than a literal name.
Thanks in advance for any guidance.

user8821725 wrote:
Is it possible - within a trigger or elsewhere - to invoke a stored procedure by using a variable containing the name of the procedure?Sure. Use dynamic SQL:
SQL> create or replace
  2  procedure p1
  3  is
  4  begin
  5  dbms_output.put_line('P1');
  6  end;
  7  /
Procedure created.
SQL> create or replace
  2  procedure p2
  3  is
  4  begin
  5  dbms_output.put_line('P2');
  6  end;
  7  /
Procedure created.
SQL> create or replace
  2  procedure p3(p_proc_name varchar2)
  3  is
  4  begin
  5  execute immediate 'begin ' || p_proc_name || '; end;';
  6  end;
  7  /
Procedure created.
SQL> set serveroutput on
SQL> execute p3('p1');
P1
PL/SQL procedure successfully completed.
SQL> execute p3('p2');
P2
PL/SQL procedure successfully completed.
SQL> SY.

Similar Messages

  • Invoking Oracle stored procedures from within a JDBC channel for PI 7.1

    Hi ,
    Can anybody tell me that is it possible to invoke Oracle stored Procedure from within a JDBC  sender channel for PI 7.1.
    Its working in XI3.0 and XI 7.0 for Oracle DBMS versions >= 10.2.x. But I am not sure,whether it will work for PI 7.1 also.
    Thanks & Regards,
    Saru

    HI,
    refer below link,there is no much difference in PI7.1 ,executing stored procedure is same .
    http://help.sap.com/saphelp_nwpi71/helpdata/EN/44/7b72b2fde93673e10000000a114a6b/content.htm
    Regards,
    Raj

  • ORA-01458 error while using Pro*C to invoke PL/SQL procedure, pls help

    I am using Pro*C (Oracle 10g on Itanium platform) to invoke PL/SQL procedure to read RAW data from database, but always encoutered ORA-01458 error message.
    Here is the snippet of Pro*C code:
    typedef struct dataSegment
         unsigned short     len;
         unsigned char     data[SIZE_DATA_SEG];
    } msg_data_seg;
    EXEC SQL TYPE msg_data_seg IS VARRAW(SIZE_DATA_SEG);
         EXEC SQL BEGIN DECLARE SECTION;
              unsigned short qID;
              int rMode;
              unsigned long rawMsgID;
              unsigned long msgID;
              unsigned short msgType;
              unsigned short msgPriority;
              char recvTime[SIZE_TIME_STRING];
              char schedTime[SIZE_TIME_STRING];
              msg_data_seg dataSeg;
              msg_data_seg dataSeg1;
              msg_data_seg dataSeg2;
              short     indSeg;
              short     indSeg1;
              short     indSeg2;
         EXEC SQL END DECLARE SECTION;
         qID = q_id;
         rMode = (int)mode;
         EXEC SQL EXECUTE
              BEGIN
                   SUMsg.read_msg (:qID, :rMode, :rawMsgID, :msgID, :msgType, :msgPriority, :recvTime,
                        :schedTime, :dataSeg:indSeg, :dataSeg1:indSeg1, :dataSeg2:indSeg2);
              END;
         END-EXEC;
         // Check PL/SQL execute result, different from SQL
         // Only 'sqlcode' and 'sqlerrm' are always set
         if (sqlca.sqlcode != 0)
              if (sqlca.sqlcode == ERR_QUEUE_EMPTY)          // Queue empty
                   throw q_eoq ();
              char msg[513];                                        // Other errors
              size_t msg_len;
              msg_len = sqlca.sqlerrm.sqlerrml;
              strncpy (msg, sqlca.sqlerrm.sqlerrmc, msg_len);
              msg[msg_len] = '\0';
              throw db_error (string(msg), sqlca.sqlcode);
    and here is the PL/SQL which is invoked:
    SUBTYPE VarChar14 IS VARCHAR2(14);
    PROCEDURE read_msg (
         qID          IN     sumsg_queue_def.q_id%TYPE,
         rMode          IN     INTEGER,
         raw_msgID     OUT     sumsg_msg_data.raw_msg_id%TYPE,
         msgID          OUT sumsg_msg_data.msg_id%TYPE,
         msgType          OUT sumsg_msg_data.type%TYPE,
         msgPrior     OUT sumsg_msg_data.priority%TYPE,
         msgRecv          OUT VarChar14,
         msgSched     OUT VarChar14,
         msgData          OUT sumsg_msg_data.msg_data%TYPE,
         msgData1     OUT sumsg_msg_data.msg_data1%TYPE,
         msgData2     OUT sumsg_msg_data.msg_data2%TYPE
    ) IS
    BEGIN
         IF rMode = 0 THEN
              SELECT raw_msg_id, msg_id, type, priority, TO_CHAR(recv_time, 'YYYYMMDDHH24MISS'),
                   TO_CHAR(sched_time, 'YYYYMMDDHH24MISS'), msg_data, msg_data1, msg_data2
                   INTO raw_msgID, msgID, msgType, msgPrior, msgRecv, msgSched, msgData, msgData1, msgData2
                   FROM (SELECT * FROM sumsg_msg_data WHERE q_id = qID AND status = 0 ORDER BY sched_time, raw_msg_id)
                   WHERE ROWNUM = 1;
         ELSIF rMode = 1 THEN
              SELECT raw_msg_id, msg_id, type, priority, TO_CHAR(recv_time, 'YYYYMMDDHH24MISS'),
                   TO_CHAR(sched_time, 'YYYYMMDDHH24MISS'), msg_data, msg_data1, msg_data2
                   INTO raw_msgID, msgID, msgType, msgPrior, msgRecv, msgSched, msgData, msgData1, msgData2
                   FROM (SELECT * FROM sumsg_msg_data WHERE q_id = qID AND status = 0 ORDER BY recv_time, raw_msg_id)
                   WHERE ROWNUM = 1;
         ELSE
              SELECT raw_msg_id, msg_id, type, priority, TO_CHAR(recv_time, 'YYYYMMDDHH24MISS'),
                   TO_CHAR(sched_time, 'YYYYMMDDHH24MISS'), msg_data, msg_data1, msg_data2
                   INTO raw_msgID, msgID, msgType, msgPrior, msgRecv, msgSched, msgData, msgData1, msgData2
                   FROM (SELECT * FROM sumsg_msg_data WHERE q_id = qID AND status = 0 ORDER BY priority, raw_msg_id)
                   WHERE ROWNUM = 1;
         END IF;
         UPDATE sumsg_msg_data SET status = 1 WHERE raw_msg_id = raw_msgID;
    EXCEPTION
         WHEN NO_DATA_FOUND THEN
              raise_application_error (-20102, 'Queue empty');
    END read_msg;
    where sumsg_msg_data.msg_data%TYPE, sumsg_msg_data.msg_data1%TYPE and sumsg_msg_data.msg_data2%TYPE are all defined as RAW(2000). When I test the PL/SQL code seperately, everything is ok, but if I use the Pro*C code to read, the ORA-01458 always happen, unless I change the SIZE_DATA_SEG value to 4000, then it passes, and the result read out also seems ok, either the bigger or smaller value will encounter ORA-01458.
    I think the problem should happen between the mapping from internal datatype to external VARRAW type, but cannot understand why 4000 bytes buffer will be ok, is it related to some NLS_LANG settings, anyone can help me to resolve this problme, thanks a lot!

    It seems that I found the way to avoid this error. Now each time before I read RAW(2000) data from database, i initialize the VARRAW.len first, set its value to SIZE_DATA_SEG, i.e., the outside buffer size, then the error disappear.
    Oracle seems to need this information to handle its data mapping, but why output variable also needs this initialization, cannot precompiler get this from the definition of VARRAW structure?
    Anyone have some suggestion?

  • How to invoke a stored procedures every hour? How to Cron ?

    Hi. I have written a stored procedure using PL/SQL and it needs to invoke every hour to reset certain value. My question is how to cron or to invoke the store procedure every hour? I'm using Oracle 9i database.
    Please advice if anyone of you had came acrossed this scenario.
    Thanks.

    As Kevin suggests, you can use cron to schedule the job, but you probably not be able to just use sqlplus on the command line. When a job is executed through cron, it nly gets the environment information that is in the global .login procedure, and nothing that is in your own .profile. In most cases, this means that that you need to call a shell script from cron, and set some environment variables. You can do this either by calling your .profile file, or by setting them explicitly.
    Another thing to consider in using cron is that the command line used to start SQL*Plus will be visible to anyone who can log on to the UNIX box. For this reason, we run all cron jobs that execute SQL using an externally identified Oracle user.
    Your minimal shell script should look something like:
    #!/usr/bin/ksh
    export ORACLE_HOME=/your/directory
    export ORACLE_SID=yoursid
    export PATH=$ORACLE_HOME/bin:$PATH
    sqlplus -s username/password @/path/sqlscript
    or alternatively
    #!/usr/bin/ksh
    . ~/.profile
    sqlplus -s / @/path/sqlscript
    Make sure that your sql script ends with an exit command to close SQL*Plus.
    John

  • How to invoke a stored procedure on MS Sql Server with Java?

    I started writing Enterprise Java Beans and created an ODBC dsn with MS Sql Server 2000 which I can access using jdbc:odbc:mySqlDSN. This all works fine using Java Sql Statements. What kind of Java/Java Sql statement can I use to invoke a stored procedure on the Sql Server? Is it possible to use ADO/ADO command objects with Java? Is it possible to import/implement Mdac2.6 ActiveX data objects libary in Java?
    Thanks

    Thanks all for your replies. I will search the api for callable statements. I am curious though, the reply that suggests using a prepared statement - can I put the name of a stored procedure in a prepared statment or is this just suggestions an action query like Insert Into, Update, Delete? Like with ADO you can say
    cmdObject.CommandType = adStoredProcedure
    cmdObject.CommandText = "NameOfStoredProc"
    cmdObject.ExecuteNonQuery()
    Once I am calling/importing/implementing the proper libraries/interfaces in Java, can a prepared statement reference a stored procedure as above?
    Thanks

  • Is it possible to use repository variable in conditional formatting

    Is it possible to use repository variable in conditional formatting . if no then is there any workaround for implementing the same....
    Also i came across a sql of an init block.. which goes like 'exec OracleBi..procedure_name'
    Is 'OracleBi..' a keyword or something like that....

    Refer http://www.biblogs.com/2008/09/03/obiee-repository-variables-filtering-and-conditional-formatting/
    Init blk is calling any procedure here with name OracleBI here...no any specific significance.
    Hope this help
    Edited by: Deepak Gupta on Aug 12, 2011 8:27 AM

  • Invoking Pl/SLQ procedure from ADF page

    is it possible to invoke a Pl/SL procedure from a simple adf page.
    this ebiz pl/sql procedure invoking a BPEL program.
    can any one suggest me on this

    Suggest you have a search of both the forum and the documentation, both of which have the answer to your question

  • How to limit the response rows while invoking a stored procedure from OSB 10gR3

    Dear Experts,
    I am trying to limit the response while invoking a stored procedure from OSB via DB adapter.
    Here the stored procedure returns cursors as response. I tried using the MaxTransactionSize propertiy (which is used for polling the database option in DB adapter).
    We are investigating the ways to protect the application from response containing huge number of rows.
    Is there any way to restrict the number of rows returned in each and every cursor while invoking the stored procedure via DB adapter?
    Thanks
    Ram

    Hi James ,
    I want to know how to run stored procedure using jca adapter in OSB11g.
    I am new to stored prcoedure,will be great if you could share some example on it as above.
    Req: Single input xml will be posted on queue ,need to perform 3 DB operation (with same input):
    1.Insert operation to insert master table contents.
    2.select the primary key column value from master table for the last inserted record.
    3.Need to insert primary key column value + other fields frm same xml file to child table.
    Pls assist me on how to create a simple stored procedure and to run the same with OSB 11g.I am familiar with creation of DB adapter using Jdeveloper,we have option to perform insert and to call stored procedure here,will it be useful for this scenario?
    Edited by: Anitha R on Nov 21, 2010 9:30 PM

  • Invoking ORACLE Stored Procedure

    Hello guys,
    I have an ORACLE stored procedure which I need to invoke. I'm currently unable to invoke the stored procedure since I'm always getting the same error:
    com.sap.engine.interfaces.messaging.api.exception.MessagingException: Error processing request in sax parser: Error when executing statement for table/stored proc. 'test.set_pickup' (structure 'STATEMENTNAME'): java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'SET_PICKUP' ORA-06550: line 1, column 7: PL/SQL: Statement
    I've faced several projects where we needed to invoke stored procedures but these were located in a DB2 or Microsoft SQL Server, and these problems never occured.
    The procedure is set to the minimum, and is now only with one input parameter. I had an input and output parameter but for narrowing the problem I've removed the output.
    The structure for the stored procedure is the one that is referred by SAP or mentioned thousand of times in this forum:
    Statement_name
    StoredProcedureName (attribute ACTION)
      TABLE
      P_TRANSACTION_ID (Attributes isInput, isOutput, type)
    For the basics I'm only filling with one statement.
    I've read some threads with a similar problem but with no response, or solved but with no suggestion on how they solved it.
    Could you please help out?
    Kind regards,
    Gonçalo Mouro Vaz

    Hi,
    Is the structure in Oracle side is of the following format?
    <StatementName>
    <storedProcedureName action=u201D EXECUTEu201D>
        <table>realStoredProcedureeName</table>
    <param1 [isInput=u201Dtrueu201D] [isOutput=true] type=SQLDatatype>val1</param1>
    </storedProcedureName >
      </StatementName>
    Can you paste the structure here?
    Regards
    Suraj

  • Is it possible to create a variable in bex with the last work day?

    Hi Gurus
    Is it possible to create a variable in bex with the last work day?
    Actually end-user every day open queries,
        - Put in selection date day - 1 or
        - put last Friday if the day is Monday or
        - put last Thursday if the day is Monday and Friday is holiday (in a calendar for example 25 the December).
    Please do the needful. It is urgent
    Thanks in advance
    Raj

    Try this logic in a customer exit:
    DATA:  l_s_range TYPE rsr_s_rangesid.
    DATA:  X_PERIOD LIKE T009B-POPER,
               X_YEAR   LIKE T009B-BDATJ.
      CASE I_VNAM.
      WHEN 'ZPREVWORKDAY'.
        DATA: l_DayOfWeek(1) TYPE C,
              l_act_date     TYPE d,
              l_prev_date    TYPE d.
        l_act_date = sy-datum.
        CALL FUNCTION  'DATE_COMPUTE_DAY'
             EXPORTING DATE = l_act_date
             IMPORTING DAY  = l_DayOfWeek.
        CASE l_DayOfWeek.
          WHEN '1'.
            l_prev_date = l_act_date - 3.
          WHEN '2'.
            l_prev_date = l_act_date - 1.
          WHEN '3'.
            l_prev_date = l_act_date - 1.
          WHEN '4'.
            l_prev_date = l_act_date - 1.
          WHEN '5'.
            l_prev_date = l_act_date - 1.
          WHEN '6'.
            l_prev_date = l_act_date - 1.
          WHEN '7'.
            l_prev_date = l_act_date - 2.
        ENDCASE.
        l_s_range-low  = l_prev_date.
        APPEND l_s_range TO e_t_range.
    ENDCASE.
    Edited by: Tyler Blouse on Feb 13, 2008 8:28 PM

  • Possibility to register Pre-/Post-Procedures for an SQL Template Handler

    I would appreciate to see the possibility to register pre-/post-procedures for an SQL template handler in ORDS 3.0.
    Why:
    We use Oracle VPD/Row-Level-Security to secure data access. Hence a trigger sets a couple of attributes in the database session context at login time which are then used in static RLS predicates to limit which records the user can see/modify.
    With ORDS 3.0 all sessions are opened under the same technical user (e.g. APEX_REST_PUBLIC_USER), hence all users have the same/no attributes in the session context and could see/modify all data.
    To avoid this situation, I need to set the attributes (e.g. the authenticated user) in the database session context before the actual query/plsql handler is executed.
    Also, resetting the session context after the handler is executed would be good.
    This scenario is in line with scenarios 'One Big Application User' and 'Web-based applications' in http://docs.oracle.com/cd/B28359_01/network.111/b28531/vpd.htm#DBSEG98291.
    Different solution approach:
    Kris suggested to write a PL/SQL handler where the pre-procedure is called before the business logic procedure/query. This is ok for me as long as I modify data and only need to return no or little data.
    As soon as I need to return a lot of data (e.g. select c1, c19, c30 from t1), this approach will force me to write a lot of code in the PL/SQL handler in order to marshal the c1, c19 and c30 to JSON and put it in the HTTP response.
    But this is the beauty of ORDS - I can simply define a template, write a GET SQL Handler 'select c1, c19, c30 from t1'  and have the data available as REST service, without writing any code to write JSON marshaled data in the HTTP response.

    I tried to log the request at Oracle REST Data Services (ORDS) but I could only start a new discussion: Possibility to register Pre-/Post-Procedures for an SQL Template Handler
    As I mentioned there, the PL/SQL handler approach works for me as long as I have no or only little data to send back to the client (e.g. put/post/delete succeeded or an error message why the call failed).
    If I need to return a lot of data from the PL/SQL handler I would need to, as far as I understand, to marshal the data to JSON and write it to the response body in the PL/SQL handler.
    I don't want to do the marshaling, because ORDS does it better.
    However, this works for me:
    I write a pipelined stored procedure that takes as input the attributes I need to set in the session context. I then can reference it in the SQL handler:
    select * from table(my_pipelined_function(:USER, ....)
    Now the JSON/HTTP response is created by ORDS again.
    I still needed to code a couple of lines, but it is way better than duplicating the functionality already existing in ORDS.
    With the hooks it would be perfect because I would not have to write any code (apart from the procedure to set the session context attributes), just configure the REST services in ORDS.

  • Is it possible to get a variable if I only know the variable by it'

    Is it possible to get a variable if I only know the variable by it's string name?
    In my case I would like to call Resources.GetStringToDisplay("TEXT_0") and get the string "bla bla 0"
    public class Resources {
    public string GetStringToDisplay(String s)
    {          //how can I to return the value of one variable
    return ............;
    public static String TEXT_0="bla bla 0";
    public static String TEXT_1="bla bla 1";
    public static String TEXT_2="bla bla 2";
    public static String TEXT_3="bla bla 3";
    Thanks

    NO you can not get Variable value by camparing string value in J2ME (because J2ME is not supporting reflection package). But you can do one thing to get same functionality.
    public static String TEXT_0="TEXT_0@bla bla 0";
    public static String TEXT_1="TEXT_1@bla bla 1";
    public static String TEXT_2="TEXT_2@bla bla 2";
    public static String TEXT_3="TEXT_3@bla bla 3";
    public string GetStringToDisplay(String s)
    if(TEXT_0.startsWith(s) )
    return TEXT_0.substring (TEXT_0.indexOf('@')+1, TEXT_0.length());
    else if(TEXT_1.startsWith(s) )
    return TEXT_1.substring (TEXT_1.indexOf('@')+1, TEXT_1.length());

  • SQL Loader:  Is it possible to set a variable?

    Hallo All,
    I am loading data with SQL Loader and find that I can set particular fields to particular values using 'CONSTANT'. That's great. However, I am loading multiple files into the same format and so would like to 'label' each load. This would be done by setting a variable before each load and then using this to write the load month (e.g. '200901') into the column 'SOURCE_FILE' in the destination table.
    I imagine the syntax would look something like this ...
    LOAD DATA
    strSource = '200809'
    INFILE 'source_data_200809.csv'
    strSource = '200810'
    INFILE 'source_data_200810.csv'
    strSource = '200811'
    INFILE 'source_data_200811.csv'
    APPEND
    INTO TABLE DESTINATION_TABLE
    FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '"'
    TRAILING NULLCOLS
    (CUSTNO char,
    BARCODE char,
    NAME char,
    SOURCE_FILE char :strSource)
    Then, for each load I would reference the variable strSource and write the appropriate month into a column/field in the table.
    I have been googling and trawling through the documentation but I cannot seem to find a way to do this. Is it possible? Or maybe there is another method/way/trick to do this? Or maybe it is just a question of syntax?
    Any ideas?
    Regards,
    Alan Searle

    Hi Kamran,
    I took a look at that thread and there were some tips including details about sending parameters through the command line ...
    SQLLDR CONTROL=controlfile.ctl, DATA=yourdatafile.csv
    But here I would need to also be able to send a parameter that I could pick up and use within SQL Loader. This might be ...
    SQLLDR CONTROL=controlfile.ctl, DATA=source_data_200809.csv VAR=200809
    ... here I would write the value '200809' to a column in the table being loaded (so that I could track back to the source of the load).
    I checked the documentation but it doesn't seem to be possible to send a variable in this way.
    Any other tips?
    Regards,
    Alan

  • Is it possible to invoke IE with UTL_HTTP.Request

    Hi,
    Is it possible to invoke IE with UTL_HTTP by specifying the URL?
    DECLARE
    LV_RET VARCHAR(2000);
    BEGIN
    SELECT UTL_HTTP.REQUEST('http://www.oracle.com')
    INTO LV_RET
    FROM DUAL;
    END;
    Thanks in Advance
    Thanks & Rgds
    M T

    Hi!
    Pls go through the following link --
    [url http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Utl_Http_Package_Enhancements/Cr_Using_Utl_Http.htm]UTL_HTTP In Oracle
    Regards.
    Satyaki De.

  • Problem in invoking the stored procedure

    Hi,
    I am trying to invoke a stored procedure thru java jdbc. The SP works if I execute it directly.
    declare P_RECORDSET1 SYS_REFCURSOR := null;
    begin
    USER1.USER_DELEGATE_PKG.GET_ACCOUNTS (P_RECORDSET1,'APP',74908,null,'Y',null);
    end;
    In the java code, I do the following
    final String sql = "{CALL USER1.USER_DELEGATE_PKG.GET_ACCOUNTS(?,?,?,?,?,?)}"
    cstmt = conn.prepareCall(sql);
    cstmt.registerOutParameter(1, OracleTypes.CURSOR);
    cstmt.setString(2, "APP");
    cstmt.setInt(3, 74908);
    cstmt.setObject(4, null);
    cstmt.setString(5, "Y");
    cstmt.setObject(6, null);
    When I execute this query, I get the Invalid SQL exception. Not really able to make out whats wrong with this query...Any clues?
    Thanks

    Alright, now I am able to atleast invoke the SP, but getting the error
    Failed to execute GET_ACCOUNTS.Message is ORA-06550: line 1, column 7:
    PLS-00306: wrong number or types of arguments in call to 'GET_ACCOUNTS'
    The procedure declaration is PROCEDURE get_accounts (
    param1 OUT T_CURSOR,
    param2 IN VARCHAR2,
    param3 IN NUMBER,
    param4 IN APP.KEY_ARRAY_T,
    param5 IN VARCHAR2,
    param6 IN APP.KEY_INT_ARRAY_T

Maybe you are looking for