Execute immediate with a string longer than 32767

hello,
is there a possibility to make an execute immediate with a statement, that is longer than the 32767 max. bytes for varchar`s? We get in a CLOB SQL-Statements with data that are longer than 32767. It would be easy if it were possible to make an execute immediate but because of the length limit it seems impossible. Does anybody know an alternative way to execute the sql-statements in the CLOB-Column?
Anna

6 execute immediate to_char(sql_text) into var_num;As a matter of interest have you tried this with a CLOB that is bigger than 32K?
When I try it the PL/SQL limit gets enforced:
SQL> declare
  2    c clob;
  3  begin
  4    dbms_lob.createtemporary(c, true);
  5    dbms_lob.writeappend(c, 43, 'CREATE OR REPLACE PROCEDURE big_p AS BEGIN ');
  6    for i in 1..800 loop
  7       dbms_lob.writeappend(c, 6, 'null;'||chr(10));
  8    end loop;
  9    dbms_lob.writeappend(c, 4, 'END;');
10    execute immediate  to_char(c);
11  end;
12  /
PL/SQL procedure successfully completed.
SQL>  declare
  2    c clob;
  3  begin
  4    dbms_lob.createtemporary(c, true);
  5    dbms_lob.writeappend(c, 43, 'CREATE OR REPLACE PROCEDURE big_p AS BEGIN ');
  6    for i in 1..8000 loop
  7       dbms_lob.writeappend(c, 6, 'null;'||chr(10));
  8    end loop;
  9    dbms_lob.writeappend(c, 4, 'END;');
10    execute immediate  to_char(c);
11  end;
12  /
declare
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 10
SQL> Cheers, APC

Similar Messages

  • How to use execute immediate for character string value 300

    how to use execute immediate for character string value > 300 , the parameter for this would be passed.
    Case 1: When length = 300
    declare
    str1 varchar2(20) := 'select * from dual';
    str2 varchar2(20) := ' union ';
    result varchar2(300);
    begin
    result := str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || ' ';
    dbms_output.put_line('length : '|| length(result));
    execute immediate result;
    end;
    /SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
    length : 300
    PL/SQL procedure successfully completed.
    Case 2: When length > 300 ( 301)
    SQL> set serveroutput on size 2000;
    declare
    str1 varchar2(20) := 'select * from dual';
    str2 varchar2(20) := ' union ';
    result varchar2(300);
    begin
    result := str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || str2 ||
    str1 || ' ';
    dbms_output.put_line('length : '|| length(result));
    execute immediate result;
    end;
    /SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
    declare
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 6

    result varchar2(300);Answer shouldn't be here ? In the greater variable ?
    Nicolas.

  • Using EXECUTE IMMEDIATE with an NVARCHAR2 parameter

    Hi everyone,
    In the system I'm working on, my stored procedure receives an NVARCHAR2 parameter which contains a complete SQL statement. e.g.
    'UPDATE SomeTable SET SomeTable.Value = 0'
    I want to be able to execute this dynamically, using EXECUTE IMMEDIATE, but I've encountered a problem where this is apparently not supported (because the string is Unicode).
    It is crucial that the string stays as Unicode, because of the data that may possible be baked into the SQL statement, and so casting it off to a VARCHAR2, or changing the parameter type, is not acceptable.
    Is there a work-around for this issue? Even if it has a performance hit, it will be better than nothing :)
    I've tried something like this;
    declare
    myVal VARCHAR2(256);
    begin
    myVal := 'UPDATE SomeTable SET SomeTable.Value = 2';
    execute immediate 'BEGIN :x; END;' using myVal;
    end;
    But I get an error;
    "bind variable 'X' not allowed in this context"
    Has anyone any ideas?
    Thanks for your help,
    Chris

    uhmm, I'm not sure if this is a valid testcase. the string could still be converted into ascii or we8iso8859p1 or whatever 1byte-character set you want.
    What I think you should test is a two-byte character as part of SQL, PL/SQL resp. as in SQL all words are defined you can not enlarge it with a 2byte word. But in PL/SQL you could define your own variable. If this variable name itself contains a 2byte character, I guess it will fail.
    (I have used l_vär and l_vér as variable names in my example)
    Message was edited by:
    Leo Mannhart
    According to the PL/SQL Reference Guide PL/SQL consists of:
    PL/SQL programs are written as lines of text using a specific set of characters:
    Upper- and lower-case letters A .. Z and a .. z
    Numerals 0 .. 9
    Symbols ( ) + - * / < > = ! ~ ^ ; : . ' @ % , " # $ & _ | { } ? [ ]
    Tabs, spaces, and carriage returns
    This seems no longer up-to-date as I could define a variable l_vär for instance as long as I use a 1byte char set (like iso8859p1). The same variable name as a n-byte char set like UTF-8 will give an error as my example shows.

  • Using EXECUTE IMMEDIATE with Create Table SQL Statement not working

    Hi ,
    I am all the privileges given from the SYSTEM user , but still i am not able to create a table under procedure . Please see these and advice.
    create or replace procedure sp_dummy as
    begin
    Execute Immediate 'Create table Dummy99_99 (Dummy_Field number)';
    end;
    even i tried this way also
    create or replace PROCEDURE clearing_Practise(p_file_id in varchar2, p_country in VARCHAR2,p_mapId in VARCHAR2)
    AUTHID CURRENT_USER AS
    strStatusCode VARCHAR2(6);
    BEGIN
    EXECUTE IMMEDIATE 'create table bonus(name varchar2(50))';
    commit;
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line('ERROR Creating Table');
    END ;

    William Robertson wrote:
    Since the syntax is correct, my guess is you do not have CREATE TABLE system privilege granted directly to your account. A common scenario is that you have this privilege granted indirectly via a role, allowing you to create tables on the command line, but stored PL/SQL is stricter and requires a direct grant and therefore the procedure fails with 'insufficient privileges'.A bit like he's already been told on his first thread...
    Using of Execute Immediate in Oracle PLSQL
    Generally you would not create tables from stored PL/SQL. Also as you have found out, it's best not to hide exceptions with 'WHEN OTHERS THEN [some message which gives less detail than the one generated by Oracle]'.Again like he was told on the other thread.
    There's just no telling some people eh! :)

  • Using EXECUTE IMMEDIATE with XML

    Database version : 10.2.0.3.0 - 64bi
    Hi All,
    I have a xml which is stored in a table, xmltype column.
    i have target insert tables whose column names and xml nodes are same.
    using all_tab_columns table i will generate columns to be passed to xmltable.
    all these data i will store in variables and finally pass to xmltable as below
    just want to know using execute immediate is good to use in XML?
    SQL_STMT := 'insert into '||table_name|| ' ( '||V_COLUMN_NAME||')';
    SQL_STMT := SQL_STMT ||' SELECT ' ||V_XTAB_COLUMN_NAME ||
    ' FROM TO_XML,
    XMLTABLE(' ||v_xpath||
    'PASSING XML_VALUE
    columns ' || V_COLUMNS_DATA_TYPE
    ||') XTAB
    WHERE Seq_NO = ' || P_SEQUENCE_NO ;
    EXECUTE IMMEDIATE SQL_STMT ;
    Thanks and Regards,
    Rubu

    1) is it OK? As I stated above, it can be made to work. It would not be my first choice, but then none of us here know the full details as well as you do so maybe there is a compelling reason to use dynamic SQL.
    Here is the documentation for [url http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/executeimmediate_statement.htm#LNPLS01317]EXECUTE IMMEDIATE.
    Actually now I finally realize your XML resides in table TO_XML so that means you won't be putting the actual XML into the shared pool via an incorrectly written dynamic SQL statement at least. That is what Odie and I were first concerned about with dynamic SQL usage, that the XML would be hard-coded into your SQL_STMT variable. You are simply changing the columns (in 3 locations). With that setup, you have no need for (nor can use) bind variables. The overall issue of dynamic SQL being slightly slower than static SQL still exists as the SQL statement will first have to be parsed and validated.
    A larger issue in terms of performance is how 10.2 handles XMLTypes. If the underlying XML is large, XMLTable performance degrades quickly. Options around this are to parse the XML in PL/SQL or to upgrade to some version of 11 and use SECUREFILE BINARY XML as the underlying storage structure for the TO_XML.XML_VALUE column.

  • How to pass a string longer than 30 to an Export Parameter in a PI sheet ?

    Hi All,
    I'm trying to set  up a process instruction in a PI sheet that calls a URL web page.
    I found the function module CALL_BROWSER and tested it in SE37 and it works fine.
    I created a process instruction to call this function module and pass parameters to it.
    Everything works if the URL is short.  For example:
    0010   PPPI_BUTTON_TEXT          Show URL
    0020   PPPI_FUNCTION_NAME          CALL_BROWSER
    0030   PPPI_FUNCTION_DURING_DISPLAY     allowed
    0040   PPPI_EXPORT_PARAMETER          URL
    0075   PPPI_STRING_CONSTANT          http://www.google.com
    This is where I ran into a roadblock. 
    The characteristic PPPI_STRING_CONSTANT is only 30 characters long.
    I can't figure out how to pass an export parameter longer than 30 characters.
    I have also tried loading up multiple PPPI_VARIABLE(s) with the idea of some how combining them into a single long string that I can pass, but no luck figuring out how.
    Any help would be greatly appreciated
    Kind Regards
    Michael

    Thanks Dario, this is good information, but it does not directly solve my problem.
    I think I have figured out an approach, but was hopeing someone else had a standard solution.
    If I don't here something soon, I will try the following:
    Create a new function moduel as a shell or wrapper that calls the standard FM RUN_Browser.
    My shell will have 5 input parameters URLP1 thru URLP5.
    I can then pass a long URL to my shell in 5 parts.
    Inside my shell, the 5 parts will be joined up into 1 long string and passed on to the URL parameter in RUN_Browser.
    If anyone has a better idea, please let me know.
    Kind Regards
    Mike Rupp

  • Execute immediate with using clause to pass column name dynamically

    Hai,
    Is there any way using execute immeidate to pass the column name dynamically. I used to pass the column value as dynamic with the help of "Using clause" . But if i use to pass column name, it is giving numberic error at run time. Eg,. for testing has been given below.
    1. Column value as dynamic, which is working correctly.
    create or replace function testexeimm (acctnum char)
    return number as
    acctbal number;
    begin
    execute immediate 'select balance from acct_master where acct_no=:a' into acctbal using acctnum;
    return acctbal;
    end;
    2. Column name as dynamic which is not working
    create or replace function testexeimm (colnam char)
    return char as
    acctbal char;
    begin
    execute immediate 'select :a from ch_acct_mast where rownum=1' into acctbal using colnam;
    return acctbal;
    end;
    Any help in this regard will be highly appericated.
    Regards
    Sridhar

    So the variable has to be numeric too:
    create or replace function testexeimm (colnam char)
    return number as
    acctbal number;
    begin
    execute immediate 'select '|||colnam||' from ch_acct_mast where rownum=1' into acctbal;
    return acctbal;
    end;Max
    http://oracleitalia.wordpress.com

  • How can I put a slideshow on automatic with movie clips longer than 2 minutes?

    How can I put a slideshow on "automatic" with movie clips that are longer than 2 minutes?

    Inspector > Animate > start transition to Automatically and set the delay to the duration of the video clip.

  • EXECUTE IMMEDIATE with an update FUNCTION returning VARCHAR2

    I need to execute immediate a stored Function (that updates the database) and returns a VARCHAR2 value.
    What does my execute immediate statement look like:
    EXECUTE IMMEDIATE 'BEGIN my_function_call; END;' RETURNING INTO return_variable;

    A set of procedures would be far preferable to a set of functions if you're doing DML.
    Additionally, I'd get rid of the status value entirely and just raise an exception if there is an error. It's a heck of a lot easier to catch (or propagate) exceptions correctly than to ensure that each and every piece of code that calls these procedures checks the return code and acts appropriately. It's way too easy to miss/ hide an error in a missed return code.
    Justin

  • Execute Immediate with SQL in Stored Procedure

    Dear Experts, Please help / guide on below statement which i want to execute in stored procedure,
    EXECUTE IMMEDIATE 'INSERT INTO TABLE
    SELECT COUNT(AGENTID) FROM TABLE_1 A,
    TABLE_2 B, TABLE_3 C
    WHERE A.COL = B.COL AND B.COL = C.COL AND
    DT BETWEEN TRUNC(SYSDATE-1) + 1/24 + 0/12/60/60 AND TRUNC(SYSDATE-1) + 25/24 - 0/12/60/60';
    Edited by: DBA on Dec 3, 2011 3:57 PM

    So what's the problem? The only thing I can see is:
    INSERT INTO TABLETABLE is reserved word, so name your table differently.
    Also, I am assuming the above statement is actually generated from some variables based on some conditions, otherwise why would you need dynamic SQL, just issue:
    INSERT INTO TABLE
    SELECT COUNT(AGENTID) FROM TABLE_1 A,
    TABLE_2 B, TABLE_3 C
    WHERE A.COL = B.COL AND B.COL = C.COL AND
    DT BETWEEN TRUNC(SYSDATE-1) + 1/24 + 0/12/60/60 AND TRUNC(SYSDATE-1) + 25/24 - 0/12/60/60;

  • Strings longer than 127 characters

    Hello,
    is it now possible to add a String from a POJO with more than 127 characters?
    Thanks
    Christian

    When you design a Crystal Reports report in Crystal Reports for Eclipse, where you drop in a POJO class for a datasource, you'll see that all String columns are given the default length of 127.
    When you inject a Collection of POJO class instances into the report using the setDataSource(java.util.Collection, ...), you'll see that any String with length greater than 127 is truncated. 
    How do you avoid this?
    In the JRC for XI R2 - you could re-compile the pojoSample.jar file after modifying the default value, or you could specify a longer length using the POJOResultSetFactory.setMemberColumnDisplaySize(...) method.
    The POJOResultSetFactory method for Crystal Report for Eclipse has been renamed and incorporated into rasapp.jar.  The source code for the POJO factory classes are no longer provided - thus, the XI Release 2 solutions do not work.
    So what you will need to do for CR for Eclipse, is you must manually create the ResultSet by invoking the com.crystaldecisions.sdk.occa.report.application.internal.POJOResultSetHelper class directly - POJOResultSetHelper is for CR4E what POJOResultSetFactory was for XI Release 2.
    Here's a code snippet:
        // SimplePojo.class is my POJO class, getName is a String property for the class,
        // and arrayList is the Collection of POJO class instances.
        POJOResultSetHelper pojoHelper = new POJOResultSetHelper(SimplePojo.class);
        pojoHelper.setMemberColumnDisplaySize("getName", 256);
        java.sql.ResultSet rs = pojoHelper.createResultSet(arrayList);
        reportClientDocument.getDatabaseController().setDataSource(rs, "SimplePojo", "SimplePojo");
    a programmer learning programming from perl is like a chemisty student learning the definition of "exothermic" with dynamite

  • ORA-01460 at REPLACE for strings longer than 4000 characters

    the following code works fine for vVar_Value less than 4001 characters but raises an ORA-01460 for strings equal to or larger than 4001 characters in my environments.
    declare
    vVar_Value VARCHAR2(32000) := '';
    begin
    for i in 1..4000 loop
    vVar_Value := vVar_Value||'X';
    end loop;
    dbms_output.Put_Line('length(vVar_Value): '||length(vVar_Value));
    SELECT REPLACE( vVar_Value, 'NO_MIDDLE_NAME', '') INTO vVar_Value FROM DUAL;
    exception
    when others then
    raise;
    end;
    any advice would be most apprectiated.
    thanks in advance.

    Why the heck are you using select from dual?
    Just use vVar_Value := REPLACE( vVar_Value, 'NO_MIDDLE_NAME', ''); and everything will be OK
    in SQL limit for varchar2 is 4K, only in PL/SQL you can use 32K
    Gints Plivna
    http://www.gplivna.eu

  • Possible bug with TREAT and EXECUTE IMMEDIATE

    Hello, i experienced a strange behavior which seems to be a bug.
    Consider following definitions:
    CREATE OR REPLACE TYPE T_Base FORCE AS OBJECT (
      DummyProperty NUMBER
    ) NOT FINAL;
    CREATE OR REPLACE TYPE T_Child UNDER T_Base (
      AnotherDummyProperty  NUMBER
    CREATE OR REPLACE FUNCTION SpecificValidation (iValue T_Child) RETURN NUMBER IS
    BEGIN
      -- some specific validation is done here, not important for the example
      RETURN NULL;
    END;
    CREATE OR REPLACE PROCEDURE ValidateIt (iValue T_Child) IS
      lResult NUMBER;
    BEGIN
      -- The principle used here is that each client can have its own implementation of validation function, and when it does not exist, we do not care.
      -- In reality we put functions and procedures into packages, I narrowed it to a minimal working example.
      BEGIN
        EXECUTE IMMEDIATE 'BEGIN :lResult := SpecificValidation(:iValue); END;'
          USING OUT lResult, IN iValue;
      EXCEPTION WHEN OTHERS THEN
        IF INSTR(SQLERRM, 'PLS-00201') = 0 THEN
          RAISE;
        END IF;
      END;
    END;
    CREATE OR REPLACE PROCEDURE Process (iValue T_Base) IS
    BEGIN
      -- in fact we know that iValue must be of typ T_Child, it is checked using IS OF ( ) operator and exception is raised if this check fails
      -- This does not work for some reason.
      -- It fails in EXECUTE IMMEDIATE with PLS-00306. I don't really get why, because ValidateIt accepts a value of type T_Child and it passes it to the validation procedure, which also expects value of type T_Child.
      ValidateIt(TREAT(iValue AS T_Child));
    END;
    CREATE OR REPLACE PROCEDURE Process2 (iValue T_Base) IS
      lChild  T_Child;
    BEGIN
      -- The only difference here is that result of TREAT is saved to a variable.
      -- This works as expected.
      lChild := TREAT(iValue AS T_Child);
      ValidateIt(lChild);
    END;
    In reality it is much more complex, I narrowed it to a minimal working example.
    Now when running this:
    DECLARE
      lItem T_Base := T_Child(5, 2);
    BEGIN
      BEGIN
        -- This call will end up with PLS-00306 error.
        Process(lItem);
        dbms_output.put_line('Process completed successfully.');
      EXCEPTION WHEN OTHERS THEN
        dbms_output.put_line('Exception when calling Process.');
        dbms_output.put_line(SQLERRM);
        dbms_output.put_line(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
      END;
      BEGIN
        Process2(lItem);
        dbms_output.put_line('Process2 completed successfully.');
      EXCEPTION WHEN OTHERS THEN
        dbms_output.put_line('Exception when calling Process2.');
        dbms_output.put_line(SQLERRM);
        dbms_output.put_line(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
      END;
    END;
    then call to Process fails with PLS-00306 on EXECUTE IMMEDIATE.
    The only difference between Process and Process2 is that in Process2, result of TREAT is saved to a variable of type T_Child.
    Is this behavior documented somwhere or is it a bug?

    That's interesting. I would say it is, or should be, a bug.
    Also interesting is, when I re-write your example to eliminate dynamic SQL and instead rely on dynamic method dispatch, the problem goes away... first, the changes:
    drop type T_Child;
    drop type T_Base
    CREATE OR REPLACE TYPE T_Base FORCE AS OBJECT ( 
      DummyProperty NUMBER 
    ) NOT FINAL
    CREATE OR REPLACE TYPE T_Child UNDER T_Base ( 
      AnotherDummyProperty  NUMBER 
    create or replace type T_Base_Processor as object (
      dummyProperty    number
    , static FUNCTION GetClientProcessor(iClientId varchar2) RETURN T_Base_Processor
    , member FUNCTION SpecificValidation (iValue T_Child) RETURN NUMBER
    , member PROCEDURE ValidateIt (iValue T_Child)
    , member PROCEDURE Process (iValue T_Base)
    , member PROCEDURE Process2 (iValue T_Base)
    ) NOT FINAL
    create or replace type T_Another_Processor under T_Base_Processor (
      overriding member FUNCTION SpecificValidation (iValue T_Child) RETURN NUMBER
    create or replace type body T_Base_Processor
    is
      static FUNCTION GetClientProcessor(iClientId varchar2) RETURN T_Base_Processor IS
    BEGIN
      return    case
            when upper(iClientId) = 'ADMINISTRATOR' then
                new T_Another_Processor(null)
            else
                new T_Base_Processor(null)
            end;
    END;
      member FUNCTION SpecificValidation (iValue T_Child) RETURN NUMBER IS 
    BEGIN 
      -- some specific validation is done here, not important for the example 
      dbms_output.put_line('T_Base_Processor.SpecificValidation');
      RETURN NULL; 
    END; 
      member PROCEDURE ValidateIt (iValue T_Child) IS 
      lResult NUMBER; 
    BEGIN 
      -- No more need for dynamic SQL, instead rely on dynamic dispatch
      lResult := SpecificValidation(iValue);
    END; 
      member PROCEDURE Process (iValue T_Base) IS 
    BEGIN 
      -- in fact we know that iValue must be of typ T_Child, it is checked using IS OF ( ) operator and exception is raised if this check fails 
      -- This does not work for some reason. 
      -- It fails in EXECUTE IMMEDIATE with PLS-00306. I don't really get why, because ValidateIt accepts a value of type T_Child and it passes it to the validation procedure, which also expects value of type T_Child. 
      ValidateIt(TREAT(iValue AS T_Child)); 
    END; 
      member PROCEDURE Process2 (iValue T_Base) IS 
      lChild  T_Child; 
    BEGIN 
      -- The only difference here is that result of TREAT is saved to a variable. 
      -- This works as expected. 
      lChild := TREAT(iValue AS T_Child); 
      ValidateIt(lChild); 
    END;
    end;
    create or replace type body T_Another_Processor
    is
      overriding member FUNCTION SpecificValidation (iValue T_Child) RETURN NUMBER
    is
    begin
      -- some other specific validation is done here, not important for the example 
      -- You could even call the overridden method as well using
      --   treat(self as T_Base_Processor).SpecificValidation(iValue)
      dbms_output.put_line('T_Another_Processor.SpecificValidation');
      RETURN NULL; 
    end;
    end;
    And again with slight modifications, your test block:
    DECLARE 
      lProcessor T_Base_Processor := T_Base_Processor.getClientProcessor('JOE');
      lItem T_Base := T_Child(5, 2); 
    BEGIN 
      BEGIN 
        -- This call no longer throws a PLS-00306 error. 
        lProcessor.Process(lItem); 
        dbms_output.put_line('Process completed successfully.'); 
      EXCEPTION WHEN OTHERS THEN 
        dbms_output.put_line('Exception when calling Process.'); 
        dbms_output.put_line(SQLERRM); 
        dbms_output.put_line(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
      END; 
      -- Demonstrate dynamic dispatch by choosing a different processor
      lProcessor := T_Base_Processor.getClientProcessor('ADMINISTRATOR');
      BEGIN 
        lProcessor.Process2(lItem); 
        dbms_output.put_line('Process2 completed successfully.'); 
      EXCEPTION WHEN OTHERS THEN 
        dbms_output.put_line('Exception when calling Process2.'); 
        dbms_output.put_line(SQLERRM); 
        dbms_output.put_line(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
      END; 
    END; 
    T_Base_Processor.SpecificValidation
    Process completed successfully.
    T_Another_Processor.SpecificValidation
    Process2 completed successfully.
    Gerard

  • How to read messages longer than network buffer size

    The logic of my application is:
    the client sends a request to the server and wait, in blocking mode, for its response.
    The server can responde with strings longer than 64KB (size of their sending and receiving buffer size), so under the hood, can also execs more than one socketChannel.write
    Nothing in the message says where it finish, nevertheless the client needs to assemble all in one big
    string.
    How can the client deal with this ? I'd like keep it as simple as possible (without using a selector)
    any thoughts ?
    thanks in advance

    Your above post suggests that it can send more than one packet (even ignoring the 64k limit.)
    In that case the data of the message must contain sufficient information. If not then the solution is not determinate.
    Ideally what you should received is a message and not just data. The message defines it contents. So you know how long it is and maybe even when it ends.
    Alternatively the data might contain something. For example if you are recieving well formatted XML then you can create a simple parser that just looks for the end tag. If it isn't well formatted, or at least you can not rely on that then it is much harder.

  • Execute immediate ignoring hints

    Hi
    I'm looking for help about an unexpected behavior in oracle. I have a query that it is executed by a stored procedure, and this query has some hints to improve its performance. When I execute the procedure with sqlplus or any other tool, using "exec myprocedure;", the process took between 30 and 40 minutes to complete. But if I call this procedure inside another procedure with execute immediate command, it took more than 5 hours to complete.
    The procedure code is
    execute immediate 'begin '||proc||'; end;';
    proc is a variable that contain the procedure name to run
    It seems that oracle are ignoring my hints when it is executed by execute immediate command. In all tests that I've done I used the same user to connect.
    The version of oracle is 9.2.0
    Tks for any help

    > Why would you do this?
    Presumably he has a variable like "v_which_procedure" which could have the values 'RAISE_PAY()' or 'FIRE_ALL_EMPLOYEES()', and some logic that determines which to use.
    I would agree though that in general it would be better to structure things so that you are not in the position of slotting the name of a procedure dynamically into an EXECUTE IMMEDIATE call.
    I don't see how SQL inside a procedure would know that the procedure itself was called dynamically, so the fact that it seems to be performing differently is a bit of a mystery. I would want to be absolutely sure that that was actually what it was doing.

Maybe you are looking for