Bind variables in static pl/sql

Hi everyone.
Does this function will works faster than function below w/o binding? (I mean if it called very often, and execution plan is in cache)
FUNCTION get_amployee_name (empid INTEGER, empcity VARCHAR2) RETURN VARCHAR2 IS
    TYPE GenericCursor IS REF CURSOR;
    c1 GenericCursor;
    empname VARCHAR2(200);
BEGIN
    OPEN c1 FOR SELECT ename FROM employees WHERE id = :id AND city = :city USING empid, empcity;
        FETCH c1 INTO empname;
    CLOSE c1;
    RETURN empname;
END;
FUNCTION get_amployee_name (empid INTEGER, empcity VARCHAR2) RETURN VARCHAR2 IS
    empname VARCHAR2(200);
BEGIN
    SELECT ename into empname  FROM employees WHERE id = empid  AND city = empcity;
    RETURN empname;
END;I have tried to find any info related to pl/sql query execution steps, but can not. Does optimizer uses real pl/sql variables values for generating exec. plan? Or it will be generated only once when function executed first time?

Hi,
It is always better to test yourself. Using bind variable is always a good practice and optimizer avoids hard parsing (soft parsing will be done here) if bind variables are used.
So yes, if this function is being executed several times frequently then second execution onwards it may run faster.
If you want to see actually what is happening behind it, trace it (using tkprof) and see the result.
See the below link to know more about SQL TRACE and tkprof.
http://download.oracle.com/docs/cd/E11882_01/server.112/e16638/sqltrace.htm#PFGRF01020
Regards,
Avinash
Edited by: Avinash Tripathi on Nov 16, 2010 11:46 PM

Similar Messages

  • Storing the contents of a substitution or bind variable in a PL/SQL var

    Hi,
    I would like to create a substitution or bind variable to store the name of a sequence to use in SQLPlus and then reference this in a PL/SQL procedure and assign the contents of the substitution or bind variable in the PL/SQL variable. Is this possible?
    Regards,
    Sean

    A substitution variable can only be used in an anonyomous PL/SQL block, not a stored procedure. You would pass the sequence name in via an input parameter to that stored proc.
    In an anonymous block though:
    sql>declare
      2    v_seq_name  user_sequences.sequence_name%type;
      3    v_value     number;
      4  begin
      5    v_seq_name := '&seq_name';  -- assign substitution to variable
      6    execute immediate 'select ' || v_seq_name || '.nextval from dual' into v_value;
      7    dbms_output.put_line( v_value );
      8  end;
      9  /
    Enter value for seq_name: SEQ
    old   5:   v_seq_name := '&seq_name';
    new   5:   v_seq_name := 'SEQ';
    24
    PL/SQL procedure successfully completed.

  • Using collections / Bind variables with a PL/SQL functio returning a query

    I have this code, which is supposed to assign collection variables as column names
    FOR i in 1 .. Collection_count -1
    LOOP
    SELECT c002 into :P341_M1 FROM APEX_collections WHERE collection_name = 'MA_SKILLS' AND seq_id=i;
    SELECT c002 into varholder FROM APEX_collections WHERE collection_name = 'MA_SKILLS' AND seq_id=i;
    vQuery:= vQuery || 'SUM(decode(label, ''Aware'', product_'|| i || ', ''Expert'', product_' || i || ', ''Proficient'', product_' || i || ', ''Advanced(Demo)'', product_' || i || ' )) as ';
    vQuery:=vQuery || varholder || ', ' ;
    END LOOP;
    I've tried &P341_M1. , :P341_M1, ':P341_M1', varholder
    When I try '&P341_M1' it returns the whole SUM(decode... line as the label
    Basically Im having a hard time using bind variables with the PL/SQL returning a query...anybody?

    Ok so working through this problem more I have realized that the problem is using the for loop i as an index value
    This will get a value:
    SELECT c002 into :P341_M1 FROM APEX_collections WHERE collection_name = 'MA_SKILLS' AND seq_id=2;
    But this won't
    SELECT c002 into :P341_M1 FROM APEX_collections WHERE collection_name = 'MA_SKILLS' AND seq_id=i;
    I'm in the for loop, and use the i variable in other places within this loop...Is there a reason why I can't compare seq_id to i?
    My new code as follows:
    FOR i in 1 .. Collection_count -1 --apex_application.g_f01.COUNT - 1
    LOOP
    varholder:=i;
    SELECT c002 into :P341_M1 FROM APEX_collections WHERE collection_name = 'MA_SKILLS' AND seq_id=2;
    SELECT c002 into varholder FROM APEX_collections WHERE collection_name = 'MA_SKILLS' AND seq_id=4;
    vQuery:= vQuery || 'SUM(decode(label, ''Aware'', product_'|| i || ', ''Expert'', product_' || i || ', ''Proficient'', product_' || i || ', ''Advanced(Demo)'', product_' || i || ' )) as f';
    vQuery:=vQuery || :P341_M1 ||i||', ' ;
    END LOOP;

  • How to pass the bind variable value to the sql statement of the LOV

    Hi,
    I am using Forms 10g builder.
    I have a text item which will be populated by a LOV when i press a button, but i have a bind variable in the SQL statement of the LOV. That bind variable should be replaced by a value which is derived from a radio group in the same data block.
    For Ex: ( )radio1 ( )radio2
    before i click on the push button, I'll select one of the radio button above,so my question is how to assign this radio group value to the bind variable in the sql statement in the LOV?
    Pl any hint is appreciated!
    Thanks
    Reddy

    The variable can be taken into account in the SELECT order contained in the Record Group used by the LOV.
    e.g. Select ... From ... Where column = :block.radio_group ...Francois

  • Using bind variables in additional pl/sql code

    How do you retrieve the a bind variable in the addition pl/sql
    code portion of the report wizard?
    I try something like
    declare
    v_test varchar2(40);
    begin
    select lastname into v_test from wvgsemp
    where username = :binduser;
    htp.bold('Report generated by:
    '||v_test);
    end;
    but it say PLS-00049: bad bind variable 'BINDUSER'
    However this is exactly the way I declared it in step one
    of the wizard?

    Hi,
    You cannot have bind variables in additional plsql code.
    Thanks,
    Sharmila

  • ORA-01006 Using Bind Variables In A Dynamic SQL Contains Query

    I have the following dynamic SQL query :-
    declare
    TYPE typ_sql IS REF CURSOR;
    ltyp_sql typ_sql;
    lv_sql VARCHAR2(100);
    begin
    lv_sql := 'SELECT arx_id FROM arx WHERE CONTAINS ';
    lv_sql := lv_sql || (arx_full,''(:b1) WITHIN ui'') > 0';
    open ltyp_sql FOR v_sql USING ln_id;
    fetch ......
    close ......
    end;
    When the code tries to open the cursor it gives the above error. I presume it is the way Oracle is expanding the bind variable but I cannot find anything in the docs to say why this is happening or whether you can do this or not using bind variables ( CONTAINS query ). Any help would be appreciated, thanks,
    Stuart.

    lv_sql || '(arx_full, :b1 || '' within ui'') > 0';

  • Bind variables in DB Connect SQL Statement in Oracle

    We are looking for ways to improve performance of DB Connect extract from an Oracle database.
    An example command that is created by the Info-Package using a DB-Connect:
    Current
    SELECT "A", "B", "C", "D", "E", "F", "G", "H"
    FROM "GSF_BW"."V_BW_FORCAST_FACT"
    WHERE ("A" = '200904') AND ("B" BETWEEN '100801' AND '101412')
    The calculated cost (calculated by Oracle Optimizer) is 25.145
    Oracle recommends the usage of bind-variables.
    In that case the Statement would need to look like:
    SELECT "A", "B", "C", "D", "E", "F", "G", "H"
    FROM "GSF_BW"."V_BW_FORCAST_FACT"
    WHERE ("PG0R_SUBD" = :b1) AND ("ZCALMONTH" BETWEEN :b2 AND :b3)
    This would reduce the cost to 11.000 which is 40% of the statement before.
    My question now is: Can anything be done to influence the generation of the SQL statement to make it better performing?

    Hi,
    It is always better to test yourself. Using bind variable is always a good practice and optimizer avoids hard parsing (soft parsing will be done here) if bind variables are used.
    So yes, if this function is being executed several times frequently then second execution onwards it may run faster.
    If you want to see actually what is happening behind it, trace it (using tkprof) and see the result.
    See the below link to know more about SQL TRACE and tkprof.
    http://download.oracle.com/docs/cd/E11882_01/server.112/e16638/sqltrace.htm#PFGRF01020
    Regards,
    Avinash
    Edited by: Avinash Tripathi on Nov 16, 2010 11:46 PM

  • Binding variables in jDeveloper's SQL Worksheet

    I try to execute something like this is SQL Worksheet:
    variable myVar varchar2(10);
    execute :myVar:='ok';
    print :myVar;
    I get ORA-00900: invalid SQL statement. In SQL plus this works just fine.
    Do I do something wrong or SQL Worksheet doesnot support full SQL specification?

    Hi,
    yes, this is a bug.
    It is fixed in JDeveloper 11 already. Because JDeveloper 11 is not yet production, if you do lots of PLSQL programming then you may want to have a look at SQL Developer, which is free of charge and does support your usecase in its current version. SQL Developer also provides the PLSQL development environment in JDeveloper 11
    Frank

  • Bind variables in custom sql subquery

    Is it possible to use bind variables in a custom sql subquery? I have a top level query built with expressions and I am using the builder.subQuery() method to execute the report query containing the custom sql.
    Thanks,
    Will

    Yes, that should be possible. Here is what to do. Make your SQL string. Where you want to bind variables, use a question mark.
    example: select empId from employee where employeeId=?
    Then you want to create a Call object. Then you can do ReportQuery rq = new ReadAllQuery (sqlCall);
    here is how to bind:
    queryParams is a Collection
    //start code
    Call sqlCall = new SQLCall();
    ((SQLCall)sqlCall).setSQLString(sqlString);
    if ((queryParams != null) && (queryParams.size() > 0)) {
         Vector sqlParameterTypes = new Vector(queryParams.size());
         Vector sqlParameters = new Vector(queryParams.size());
         Iterator iter = queryParams.iterator();
         while (iter.hasNext()) {
              Object queryParameter = iter.next();
              sqlParameterTypes.add(SQLCall.IN);
              sqlParameters.add(queryParameter);
         ((SQLCall)sqlCall).setParameterTypes(sqlParameterTypes);
         ((SQLCall)sqlCall).setParameters(sqlParameters);
    //end code
    I hope this helps. The APIe changed from 9.0.4.5 to 10.1.3 so this code is for 10.1.3. Post if you have any more questions.
    Zev.

  • Bind variables in SQL Developer

    I declared a bind variable called 'test_num' and assigned a value of 10 as shown below.
    variable test_num number
    BEGIN
    :test_num := 10;
    dbms_output.put_line ('The Test Value: ' || :test_num);
    END;
    When I execute the above program, the output is thrown as 'The Test Value: '. The value of test_num is not shown. I fear whether this issue is due to SQL Developer which i am using to execute this program.
    Please let me know why the value is not getting printed
    Thanks for your help!

    I see the same issue you are seeing when using the bind variable. The bind variable works fine in SQL*Plus but not from SQL Developer.
    From SQLPlus*
    SQL> set serveroutput on
    SQL> variable test_num number
    SQL> BEGIN
    2 :test_num := 10;
    3 dbms_output.put_line ('The Test Value: ' || :test_num);
    4 END;
    5 /
    The Test Value: 10
    PL/SQL procedure successfully completed.
    From SQLDeveloper*
    set serveroutput on
    variable test_num number
    BEGIN
    :test_num := 10;
    dbms_output.put_line ('The Test Value: ' || :test_num);
    END;
    anonymous block completed
    The Test Value:

  • Bind variables in region_type_plugin_nl_amis_scheffer_region_pdf.sql plugin

    Hi all,
    is it possible to used a bind variable in the region_type_plugin_nl_amis_scheffer_region_pdf.sql plugin???
    regards,
    sake

    Hi Craig,
    All Detail reports in my case are not directly displayed under the reports tab of my plugin homepage. Currently Iam displaying a simple tabular report(s) constructed using 'IPMSG_USER_TABLE_FROM_SQL' under the report tab of my plugin homepage and the column data of these reports have being made as hyperlink to these detalil report.
    l_param_values(6) := MGMT_IP_PARAM_VALUE_RECORD (
    'oracle.sysman.eml.ip.render.elem.TableRender.columnDestReportTitle6',
    Current Sessions');
    l_param_values(7) := MGMT_IP_PARAM_VALUE_RECORD (
    'oracle.sysman.eml.ip.render.elem.TableRender.columnDestParamColumnIndexes6',
    '0,1,8');
    All my Detail reports have been created using p_system_report => 0 flag so they are not directly accessible from the global report tab. Clicking the hyperlinked column values, these Detail reports are displayed under the global EM "Reports" tab. And Iam also passsing parameters EMIP_BIND_PARAM1, EMIP_BIND_PARAM1 which are further used in Detail report's SQL.
    On all my detail reports Iam getting a button for dynamic time selector, after selecting the timezone and time period some how the passed variables are lossing their values EMIP_BIND_PARAM1, EMIP_BIND_PARAM1. I am printing the values of these parameters from DUAL.
    Regards
    Sanjay

  • How to use bind variables in this procedure

    Hi Experts,
    How to use bind variables in this procedure for static queries.
    PROCEDURE DELETE_MER_PROC (M_id IN NUMBER)
    IS
    BEGIN
    V_date DATE;
    SELECT PD_DATE INTO v_date FROM PD_MAINTAIN;
        DELETE FROM MER_CLEAR
        WHERE MER_DT < v_date
        AND ID = M_ID;
    COMMIT;
    END;   
    How to use  v_date and m_id as bind variables in this procedure to avoid hard parsing.
    Please help me.
    Thanks.

    976208 wrote:
    How to use  v_date and m_id as bind variables in this procedure to avoid hard parsing.
    You cannot avoid hard parsing - as the 1st time a SQL statement (like the SELECT or DELETE statements in your code) is encountered, it does not reside in the server's Shared Pool, and needs to be added into the pool via a hard parse.
    Bind variables does not prevent hard parsing. Hard parsing happens when the SQL statement (with or without bind variables) is a brand new statement encountered by the server.
    Bind variables enables the same SQL cursor to be reused, by simply changing the bind variable value.
    Not using bind variables means that each SQL statement is unique and not shareable - as the value is hardcoded into the statement and cannot be changed via a bind value. This typically means LOTS of different SQL statements (where the only difference is the changed value in the statement) are created - with each statement being a new statement not seen before in the Shared Pool and needing to be hard parsed.
    One does not design one's code not to be hard parsed. There ALWAYS will be a hard parse in order to get a SQL statement into the Shared Pool. One designs one's code to REUSE cursors in the Shared Pool.

  • Portal bind variables in Dynamic Pages

    I have two bind variables in a dynamic Page:
    Variable Default Value
    :p_lrg_item_id 12153
    :p_lrg_color 'Rock/Black'
    I put the two variables in the where clause of my select
    statement:
    <ORACLE>
    Select distinct
    prod.prfield5,
    prdat.paval
    from product@ecom2 prod,
    prodatr@ecom2 prdat
    where prod.prprfnbr = :p_lrg_item_id
    and prdat.paprnbr = prod.prrfnbr
    and prod.prpub = 1
    and prdat.paname = 'color'
    and prdat.paval = :p_lrg_color;
    Then when I run the Page the query does not return any rows. So
    I tested my query on the database and it returned the row. So I
    took out the "and prdat.paval = :p_lrg_color" and the query
    returned all of the rows. I also put the following line in the
    code to view the variable: "htp.p('<p>'||upper(:p_lrg_color)
    ||'</p>')" and it printed 'Rock/Black' on my page. Has anyone
    else ran into this problem with bind variables.
    Thanks Steve

    Why are you using dynamic sql for that?
    Is it really necessary to proceed as such?
    It will be better to use Static PL/SQL(stored procedures , functions and package) as far as there will be an "auto binding". If you use static SQL you will not have to care about using bind variables inside your PL/SQL code. All you have to do is to make sure you will call your stored PL/SQL procedure using bind values in the input parameters
    see the following blog article for more details
    http://hourim.wordpress.com/2011/06/16/bind-variable-shared-pool-and-cursor-sharing-parameter/
    Best regards
    Mohamed Houri
    www.hourim.wordpress.com

  • Question reg bind variable...

    hi,
    I have learnt that when we pass parameter to proc/func. those parameters are auto. treated as bind variables...
    but what if I have a simple proc. which does not accept any argumets nor it returns anything just a batch job type for e.g to send emails.. then how will the variables declared in that proc treated as bind variables or not?
    If not, how can i modify the proc to use bind variables
    thx

    Any PL/SQL variables or parameters will be automatically treated as bind variables in static SQL. There is nothing special you have to do.

  • How to use bind variables in desc flexfields in OA pages?

    Use case: In EBS 11i we have a DFF on po_vendors and one of the segment has a table validated value set that is referencing a forms variable i.e :VENDORS.VENDOR_ID. Now after upgrading to R12 this won't work as the vendor pages moved to OA framework. Is there any way to reference the vendor_id column in OA framework?

    976208 wrote:
    How to use  v_date and m_id as bind variables in this procedure to avoid hard parsing.
    You cannot avoid hard parsing - as the 1st time a SQL statement (like the SELECT or DELETE statements in your code) is encountered, it does not reside in the server's Shared Pool, and needs to be added into the pool via a hard parse.
    Bind variables does not prevent hard parsing. Hard parsing happens when the SQL statement (with or without bind variables) is a brand new statement encountered by the server.
    Bind variables enables the same SQL cursor to be reused, by simply changing the bind variable value.
    Not using bind variables means that each SQL statement is unique and not shareable - as the value is hardcoded into the statement and cannot be changed via a bind value. This typically means LOTS of different SQL statements (where the only difference is the changed value in the statement) are created - with each statement being a new statement not seen before in the Shared Pool and needing to be hard parsed.
    One does not design one's code not to be hard parsed. There ALWAYS will be a hard parse in order to get a SQL statement into the Shared Pool. One designs one's code to REUSE cursors in the Shared Pool.

Maybe you are looking for

  • Not able to run System meaurement

    Hi Experts, I am trying to run System Measurement with the tocde USMM. But i am getting the following error, not able to run the system measurement.and i set correct price list also. I am able to run this in my Development Server .Before running the

  • Query to get the blocker and holder info

    Hi All, I have framed the following query to get the blocker and holder info.I intend to use this query in a auto-generated mail which executes every 15 mins I have put an outer join on the holder because the holder query might have been executed at

  • Dreamweaver suddenly slow?

    Running CS4 on Mac OSX v 10.5.8, PowerPC G5, 1.5 GB RAM. Normally Dreamweaver runs fine -- not super speedy, but workable. Every now and then, it suddenly slows down. Today it's taking over a minute for the beachball to stop spinning after changing a

  • HT201210 i keep getting a error msg saying network connection time out.

    Im trying to updat my iphone to new software and keep getting a error msg saying network connection times out. Plz help!!!!

  • Udate

    I have adobe 9.5.5 and think I have adobe acrobat, but "it" says I have to update adobe air, but "it" won't..get  error #16820 I don't want to buy acrobat for $139 or Pro for $199 !!!