Generic cursors and generic result sets - How to?

Hi all,
I'm currently developing some kind of table export util. All it should do is to take a list of table names, determine the table structure (aka fields), fetch all data from this table and store a flat textfile containing all table data as ready-to-use INSERT statements.
Please do not tell me that I could use DataPump or imp/exp, I know this but in this specific project this is not possible. I simply need one textfile per Table, that's it.
So far my approach is the following:
- Developed a package which contains a hard-coded list of tables as "TABLE OF VARCHAR2".
- One procedure inside this package determines the list of fields for every passed tablename and their corresponding fieldtypes and generates a SELECT and INSERT query.
- Another procedure will get the created SELECT query (which is valid, I've tested this) and performs a "OPEN <generic_cursor> FOR <select_query>";
And here is also my problem. After "OPEN" the generic cursor I need a record to fetch the data row into. However as the list of tables is dynamic, so must be the records where to fetch into. I did not find any possible way of dynamically creating a record for the "FETCH INTO" statement. So far the only solution I've found was to hardcode the results of the tables and use IF/ELSE or CASE logic inside the data retrival procedure to fetch always into the right record:
PROCEDURE DUMP_TABLES(P_TABLENAME VARCHAR2, P_SELECT VARCHAR2)
G_CV genericcurtyp;
T_MC_USERS MC_USERS%ROWTYPE;
T_CDALBUM CDALBUM%ROWTYPE;
BEGIN
OPEN G_CV FOR P_SELECT;
LOOP
IF P_TABLENAME = 'MC_USERS' THEN
FETCH G_CV INTO T_MC_USERS;
ELSE
FETCH G_CV INTO T_CDALBUM;
END IF;
EXIT WHEN G_CV%NOTFOUND;
END LOOP;
END;
What I really would like to use is something like this:
PROCEDURE DUMP_TABLES(P_TABLENAME VARCHAR2, P_SELECT VARCHAR2)
G_CV genericcurtyp;
TYPNAME VARCHAR2(32):='T_'||P_TABLENAME;
MYRES TYPNAME%ROWTYPE;
BEGIN
OPEN G_CV FOR P_SELECT;
LOOP
FETCH G_CV INTO MYRES;
EXIT WHEN G_CV%NOTFOUND;
-- Do something with the row data in MYRES
END LOOP;
CLOSE G_CV;
END;
Of course I could hard-code everything, however I would like to keep the possibility to extend the list of tables simply by adding another entry to my list of tablenames without having to add additional code whenever the table list changes.
I've tried also the "FOR i IN (<SELECT>)", however this won't accept a variable for the <SELECT>.
Maybe someone here as an idea how to solve this problem without having to hard-code the required result sets of all affected tables? Or maybe I'm simply going the wrong way and someone could show me the right one?
Any help would be appreciated.
Best regards,
Sascha

You could use DBMS_SQL instead. DBMS_SQL provides DESCRIBE procedure so you can get count and datatypes of select list elements. If you are on 11g you can convert ref cursor to DBMS_SQL cursor or vice versa. But I would use a different solution. First of all, what are you creating "export" for? If you are planning to use it to load data into another Oracle database I'd simply use external tables. If you really need CSV, I'd use DBMS_SCHEDULER and run SQL*Plus task spooling output to a file.
SY.

Similar Messages

  • Store procedure which get list of values separated by semicolon and return result set as a string semicolon separated string

    Hello,
    I am trying to make stored procedure in what i am getting i_group_id  as a list of groups seprated by semicoln like 1,2,14,17,23.
    And i want list of emails based on that group. And result set will be as a list of emails seprated by semicolon.
    If you know how to install that in stored procedure please help me. Appreciate your help.
    Thanks.
    PROCEDURE get_groups_email(i_group_id    IN VARCHAR2,
                               x_group_email_dtl_cur OUT resultcur)
    IS
    x_group_email VARCHAR2(4000):=NULL;
    BEGIN                           
       FOR i IN (SELECT   TRIM(emp.email) email
                   FROM   ems.employee emp,
                          ems.groups_employee egrp
                  WHERE   egrp.group_id IN (i_group_id)
                    AND   emp.person_id = egrp.person_id) LOOP
        x_group_email:= x_group_email || i.email ||';';
      END LOOP;
      x_group_email := RTRIM(x_group_email,';');
       OPEN x_group_email_dtl_cur FOR 
         SELECT   x_group_email
           FROM   DUAL; 
    DBMS_OUTPUT.PUT_LINE('x_group_email:' || x_group_email);                                       
    END get_groups_email;
    PROCEDURE get_groups_email(i_group_id    IN VARCHAR2,
                               x_group_email_dtl_cur OUT resultcur)
    IS
    x_group_email VARCHAR2(4000):=NULL;
    BEGIN                           
       FOR i IN (SELECT   TRIM(emp.email) email
                   FROM   ems.employee emp,
                          ems.groups_employee egrp
                  WHERE   egrp.group_id IN (i_group_id)
                    AND   emp.person_id = egrp.person_id) LOOP
        x_group_email:= x_group_email || i.email ||';';
      END LOOP;
      x_group_email := RTRIM(x_group_email,';');
       OPEN x_group_email_dtl_cur FOR 
         SELECT   x_group_email
           FROM   DUAL; 
    DBMS_OUTPUT.PUT_LINE('x_group_email:' || x_group_email);                                       
    END get_groups_email;

    1013527 wrote:
    I am using Oracle 9.7.2. Not 11g.
    No Database at hand to provide a working example.
    So use http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:73830657104020 to split your list into rows.
    Join that to your table of e-mail addresses
    then take a look at http://www.sqlsnippets.com/en/topic-11787.html maybe chosing http://www.sqlsnippets.com/en/topic-12087.html
    and you're done.
    Regards
    Etbin
    something to play with (still NOT TESTED!)
    with
    e_mails as
    (select 1 user_id,'alpha' || chr(64) || 'domain.eu' e_mail from dual union all
    select 2,'beta' || chr(64) || 'domain.eu' from dual union all
    select 3,'gamma' || chr(64) || 'domain.eu' from dual union all
    select 4,'delta' || chr(64) || 'domain.eu' from dual union all
    select 5,'epsilon' || chr(64) || 'domain.eu' from dual union all
    select 6,'zeta' || chr(64) || 'domain.eu' from dual union all
    select 7,'eta' || chr(64) || 'domain.eu' from dual union all
    select 8,'theta' || chr(64) || 'domain.eu' from dual union all
    select 9,'iota' || chr(64) || 'domain.eu' from dual union all
    select 10,'kappa' || chr(64) || 'domain.eu' from dual union all
    select 11,'lambda' || chr(64) || 'domain.eu' from dual union all
    select 12,'mu' || chr(64) || 'domain.eu' from dual union all
    select 13,'nu' || chr(64) || 'domain.eu' from dual union all
    select 14,'xi' || chr(64) || 'domain.eu' from dual union all
    select 15,'omicron' || chr(64) || 'domain.eu' from dual union all
    select 16,'pi' || chr(64) || 'domain.eu' from dual union all
    select 17,'rho' || chr(64) || 'domain.eu' from dual union all
    select 18,'sigma' || chr(64) || 'domain.eu' from dual union all
    select 19,'tau' || chr(64) || 'domain.eu' from dual union all
    select 20,'upsilon' || chr(64) || 'domain.eu' from dual union all
    select 21,'phi' || chr(64) || 'domain.eu' from dual union all
    select 22,'chi' || chr(64) || 'domain.eu' from dual union all
    select 23,'psi' || chr(64) || 'domain.eu' from dual union all
    select 24,'omega' || chr(64) || 'domain.eu' from dual
    groups as
    (select 1 g_id,'1,15,21,17' members from dual union all
    select 2,'23,10,3,20,7,23,15,9' from dual union all
    select 3,'3,4,5,6,7,8' from dual union all
    select 4,'23,24,15,16,7,18' from dual
    select g_id,
           substr(sys_connect_by_path(e_mail,';'),2) e_mail_list
      from (select g.g_id,
                   e.e_mail,
                   row_number() over (partition by g.g_id order by e.user_id) rn
              from e_mails e,
                   groups g
             where instr(','||g.members||',',','||to_char(e.user_id)||',') > 0
               and instr(','||:group_list||',',','||to_char(g.g_id)||',') > 0
    where connect_by_isleaf = 1
    start with rn = 1
    connect by rn = prior rn + 1
            and g_id = prior g_id
    Message was edited by: Etbin provided a small example

  • Store procedure which get list of values separated by semicolon and return result set as a string semicolon separated strin

    Hello,
    I am trying to make stored procedure in what i am getting i_group_id  as a list of groups seprated by semicoln like 1,2,14,17,23.
    And i want list of emails based on that group. And result set will be as a list of emails seprated by semicolon.
    Can anybody please help me for that. Thanks in advance.
    PROCEDURE get_groups_email(i_group_id    IN VARCHAR2,
                               x_group_email_dtl_cur OUT resultcur)
    IS
    x_group_email VARCHAR2(4000):=NULL;
    BEGIN                            
       FOR i IN (SELECT   TRIM(emp.email) email
                   FROM   ems.employee emp,
                          ems.groups_employee egrp
                  WHERE   egrp.group_id IN (i_group_id)
                    AND   emp.person_id = egrp.person_id) LOOP
        x_group_email:= x_group_email || i.email ||';';
      END LOOP;
      x_group_email := RTRIM(x_group_email,';');
       OPEN x_group_email_dtl_cur FOR  
         SELECT   x_group_email
           FROM   DUAL;  
    DBMS_OUTPUT.PUT_LINE('x_group_email:' || x_group_email);                                        
    END get_groups_email;
    PROCEDURE get_groups_email(i_group_id    IN VARCHAR2,
                               x_group_email_dtl_cur OUT resultcur)
    IS
    x_group_email VARCHAR2(4000):=NULL;
    BEGIN                            
       FOR i IN (SELECT   TRIM(emp.email) email
                   FROM   ems.employee emp,
                          ems.groups_employee egrp
                  WHERE   egrp.group_id IN (i_group_id)
                    AND   emp.person_id = egrp.person_id) LOOP
        x_group_email:= x_group_email || i.email ||';';
      END LOOP;
      x_group_email := RTRIM(x_group_email,';');
       OPEN x_group_email_dtl_cur FOR  
         SELECT   x_group_email
           FROM   DUAL;  
    DBMS_OUTPUT.PUT_LINE('x_group_email:' || x_group_email);                                        
    END get_groups_email;

    >
    Can anybody please help me for that
    >
    Not in this forum they can't. This forum, as the title says, is for SQL Developer questions only.
    Please mark this question ANSWERED and repost it in the SQL and PL/SQL forum
    https://forums.oracle.com/community/developer/english/oracle_database/sql_and_pl_sql

  • Query database and return result set to cells.

    hello all i have vsto solution im building im trying to put together a generic query text box for my end user the only problem is that it appears to be that with oracle data access when you do a query you must pass all the values to a variable.
    Sub Orcl()
            Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _
                       + "(ADDRESS=(PROTOCOL=TCP)(HOST=xxx)(PORT=1521)))" _
                       + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=xxx)));" _
                       + "User Id=xx;Password=xx;"
             Dim conn As New Oracle.DataAccess.Client.OracleConnection(oradb) ' Visual Basic
            conn.Open()
            Query = select * from fabinvh
            Dim cmd As New Oracle.DataAccess.Client.OracleCommand
            cmd = conn.CreateCommand()
            cmd.Connection = conn
            cmd.CommandText = Query
            Dim dr As Oracle.DataAccess.Client.OracleDataReader = cmd.ExecuteReader()
            While dr.Read()
                Globals.ThisAddIn.Application.ActiveCell.Value = (dr.Item(1))''' HOW DO I CHANGE HERE TO JUST BRING IN ALL THE COLUMNS AND HEADERS?
                Globals.ThisAddIn.Application.ActiveCell.Offset(1, 0).Select()
            End While
            dr.Dispose()
            cmd.Dispose()
            conn.Dispose()
        End Subthanks in advance im able to do this with oo4o rather easily but I'm tryint go learn more of the odp.net oracle data access and learning is pretty slow right now.

    ok I think im getting closer to my answer i believe i need to use the
    GetValues. property. does anyone have an example on how to use this i keep getting errors when i try it.

  • Procedure to take inpot data set and return result set

    Hi all,
    I have a situation where there will be one "standard" set of data (source_data below) and I will need to get information on results for certain groups of clients (client_data being an example). As straight SQL this would be very easy (see below) -- real world problem is a little more complicated. However, what I would like to do is set up a procedure so that I can pass it my variable client data and it will spit back out a data set the same as the output from the given SQL.
    A pointer in the right direction would be appreciated. If I could "pass the client data" as a string containing a SQL query, that would be even better, e.g.
    GetResults('select client_id,min(whatever_date) from some_client_data where .....',MyOutputRefCursor?)
    create table source_data
    (client_id integer,
    tdate date,
    amount number(6,2));
    create table client_data
    (client_id integer,
    critical_date date);
    insert into source_data values(1,to_date('20090104','yyyymmdd'),1000);
    insert into source_data values(1,to_date('20100104','yyyymmdd'),2000);
    insert into source_data values(1,to_date('20110104','yyyymmdd'),3000);
    insert into source_data values(1,to_date('20120104','yyyymmdd'),4000);
    insert into source_data values(2,to_date('20090104','yyyymmdd'),5000);
    insert into source_data values(2,to_date('20090604','yyyymmdd'),1000);
    insert into source_data values(2,to_date('20100104','yyyymmdd'),2000);
    insert into source_data values(3,to_date('20091004','yyyymmdd'),3000);
    insert into source_data values(3,to_date('20091104','yyyymmdd'),4000);
    insert into source_data values(4,to_date('20090104','yyyymmdd'),5000);
    insert into source_data values(4,to_date('20090604','yyyymmdd'),2000);
    insert into client_data values(1,to_date('20110104','yyyymmdd'));
    insert into client_data values(2,to_date('20090604','yyyymmdd'));
    select c.client_id,
      sum(CASE WHEN tdate < critical_date then amount else null end) used_before,
      sum(CASE WHEN tdate >= critical_date then amount else null end) used_after
    from source_data s
    inner join client_data c on s.client_id = c.client_id
    GROUP BY c.client_id;Thanks,
    Jon

    JonWat wrote:
    I have a situation where there will be one "standard" set of data (source_data below) and I will need to get information on results for certain groups of clients > (client_data being an example). As straight SQL this would be very easy (see below) -- real world problem is a little more complicated. Can you give a more accurate representation of the real world problem?
    A pointer in the right direction would be appreciated. If I could "pass the client data" as a string containing a SQL query, that would be even better, e.g.Passing a query as as string for execution is rarely the correct approach. This approach won't scale and most likely will result in maintenance and security problems.
    If you can update your post to have a more accurate representation of the problem you are trying to solve you'll probably get an acceptable answer. Other than that all I can suggest is that you need to rethink the approach a bit. For example, if you know you need to filter out a set of data to join to your SOURCE_DATA table, why couldn't you do that inside the procedure?
    SELECT c.client_id
         , SUM
           ( CASE
             WHEN tdate < critical_date
             THEN amount
             END
           ) AS used_before
        ,  SUM
           ( CASE
             WHEN tdate >= critical_date
             THEN amount
             END
           ) AS used_after
    FROM   source_data s
    JOIN   ( SELECT client_id
                  , MIN(<date column>) AS critical_date
             FROM   client_data
             WHERE  <where clause>
             GROUP BY client_id
           ) c on s.client_id = c.client_id
    GROUP BY c.client_id;

  • Dynamically calling stored procedure and getting result set c++

    Hello,
    I am trying to write some c++ code that will dynamically bind values to a stored procedure and excute the procedure and get back a resultset. The problem I am running into is how to get back the resultset. Any help or example would be highly appreciated.

    int main(int argc, char* argv[])
    OCIError* pOciError;
    char* pConnectChar = "dbname";
    char* pUsernameChar = "scott";
    char* pPasswordChar = "tiger";
    int answer;
    OCIStmt* pOciStatement;
    char* sqlCharArray = "BEGIN :success := sp_ListEmp; END;";
    int id;
    char ename[40];
    OCIEnv* g_pOciEnvironment = NULL;
    OCIServer* g_pOciServer = NULL;
    OCISession* g_pOciSession = NULL;
    OCISvcCtx* g_pOciServiceContext = NULL;
    sb2* pIndicator=0;
    sb2* pIndicator2=0;
    sb2* pIndicator3=0;
    OCIDefine* pOciDefine;
    OCIDefine* pOciDefine2;
    OCIBind* pBind;
    OCIStmt* cursor;
    answer = OCIInitialize(OCI_THREADED, NULL, NULL, NULL, NULL);
    answer = OCIEnvInit(&g_pOciEnvironment, OCI_DEFAULT, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&pOciError, OCI_HTYPE_ERROR, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciSession, OCI_HTYPE_SESSION, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServer, OCI_HTYPE_SERVER, 0, NULL);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)&g_pOciServiceContext, OCI_HTYPE_SVCCTX, 0, NULL);
    answer = OCIServerAttach(g_pOciServer, pOciError, (unsigned char *)pConnectChar, strlen(pConnectChar),
    OCI_DEFAULT);
    answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pUsernameChar, strlen(pUsernameChar),
    OCI_ATTR_USERNAME, pOciError);
    answer = OCIAttrSet(g_pOciSession, OCI_HTYPE_SESSION, (unsigned char *)pPasswordChar, strlen(pPasswordChar),
    OCI_ATTR_PASSWORD, pOciError);
    answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciServer, 0, OCI_ATTR_SERVER, pOciError);
    answer = OCIAttrSet(g_pOciServiceContext, OCI_HTYPE_SVCCTX, g_pOciSession, 0, OCI_ATTR_SESSION, pOciError);
    answer = OCISessionBegin(g_pOciServiceContext, pOciError, g_pOciSession, OCI_CRED_RDBMS, OCI_DEFAULT);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&pOciStatement), OCI_HTYPE_STMT, 0, NULL);
    answer = OCIStmtPrepare(pOciStatement, pOciError, (unsigned char *)sqlCharArray, strlen(sqlCharArray),
    OCI_NTV_SYNTAX, OCI_DEFAULT);
    answer = OCIHandleAlloc(g_pOciEnvironment, (void **)(&cursor), OCI_HTYPE_STMT, 0, NULL);
    answer = OCIBindByPos(pOciStatement,&pBind, pOciError, 1, &cursor, 0,SQLT_RSET,
    pIndicator2, 0,NULL, 0,0,OCI_DEFAULT);
    answer = OCIStmtExecute(g_pOciServiceContext, pOciStatement, pOciError, 1, 0, NULL, NULL,
    OCI_COMMIT_ON_SUCCESS);
    answer = OCIDefineByPos(cursor,&pOciDefine, pOciError,2,&id,sizeof(int),
    SQLT_INT,pIndicator, 0, 0,OCI_DEFAULT);
    answer = OCIDefineByPos(cursor,&pOciDefine2, pOciError,1,ename,40,
    SQLT_STR,pIndicator3, 0, 0,OCI_DEFAULT);
    if (answer == 0)
    while ((answer = OCIStmtFetch(cursor,pOciError, 1,OCI_FETCH_NEXT,OCI_DEFAULT)) == 0)
    printf("fetched id %d and name %s\n",id,ename);
    answer = OCIHandleFree(pOciError, OCI_HTYPE_ERROR);
    return 0;

  • Result Set - How to retrieve the number of rows in resultset

    harlo....everyone.
    i m new in this language and would like to ask that how can i store the result into an array or u all hav others ideal to do it......? Hopefully can get answer asap....thanksssss.
    Below is the source code that i did. Please comment it
    ResultSet rs = stmt.executeQuery("Select CCourse_Code from RegisteredCourse, Student where Student.NStud_ID ='123'and Student.CStud_Pwd='123' and Student.NStud_ID = RegisteredCourse.NStud_ID ");
    if(rs!=null){
    // can i get the the number of records in resultset, rs to define my array size
    String course[] = new String[2];
    while(rs.next()){
    for(int i =0; i<course.length; i++)
    course[i] = rs.getString("ccourse_code");
    return course;

    Or...
    ResultSet rs = stmt.executeQuery("Select count(CCourse_Code) from RegisteredCourse, Student where Student.NStud_ID ='123'and Student.CStud_Pwd='123' and Student.NStud_ID = RegisteredCourse.NStud_ID ");
    This should return a table with one row and one column. This will hold the number originally requested.
    However I would still go with the ArrayList suggestion given above.

  • Nested FOR cursor and now results

    Hi Guys,
    I have a simple nexted FOR cursor but the second cursor does not retrieve
    anything at all. The first cursor retrieves values from a-z in low caps letters.
    If I replace in cursor 2 the clause
    SUBSTR(key#,1,1) = SUBSTR(key_rec1.key#,1,1);
    with
    SUBSTR(key#,1,1) = 'a'
    It works fine, if I leave it without my manuall fix it does not retrieve
    any rows. Anyone an idea? I use Oracle 11g.
    DECLARE
    CURSOR c1 IS
    SELECT DISTINCT(SUBSTR(key#,1,1)) AS key# FROM mytable;
    key_rec1 c1%rowtype;
    CURSOR c2 IS
    SELECT key#,
    FROM mytable
    WHERE
    *SUBSTR(key#,1,1) = SUBSTR(key_rec1.key#,1,1); --key_rec1.key#;*
    key_rec2 c2%rowtype;
    BEGIN
    FOR key_rec1 in c1
    LOOP
    FOR key_rec2 in c2
    LOOP
    INSERT INTO mytable2
    key#
    *          SELECT key#*
    *          FROM mybookingtab bsch*
    *          where bsch.key# = key_rec2.key#*
    END LOOP; -- c2
    *END LOOP; --c1*
    END;
    */*

    One should think you'd have learned how to use tags withing 400+ posts...
    not tested:{code}declare
    CURSOR c1 IS
    SELECT DISTINCT (SUBSTR (key#
                           ,  1
                           ,  1
                      AS key#
      FROM mytable;
    -- key_rec1 c1%ROWTYPE; -- needing this should have triggered some thinking...
    CURSOR c2 (p_key_rec1 c1%ROWTYPE)IS -- declare a parameter
    SELECT key#,
    FROM mytable WHERE SUBSTR(key#,1,1) = SUBSTR(p_key_rec1.key#,1,1);  --key_rec1.key#;
    --key_rec2 c2%ROWTYPE;
    BEGIN
      FOR key_rec1 IN c1 LOOP
        FOR key_rec2 IN c2(key_rec1) LOOP -- pass the outer loops current row
          INSERT INTO mytable2 (key#)* (*
    * SELECT key#*
    * FROM mybookingtab bsch*
    * where bsch.key# = key_rec2.key#*
    END LOOP; -- c2
    END LOOP; --c1
    END;
    /{code}
    bye
    TPD                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

  • Mail and Asian fonts set-how to reset...

    I am attempting to remote support a client using Apple Mail. He has a Mac Book Air/Lion (not sure if 10.7.4 yet) but my email to him is getting interpted as Asian character set.
    I'm thiking of looking within Mail/Preference/Fonts and Colors but the larger issue is what precipitated this in the first place. Shoudl I be looking elsewhere.
    Body of the text is Asian font set but the email address and other particualrs from him and me are English.
    Should I look at keyboard preferences as well?
    Looking for guidance.
    Many thanks to all...

    He uses Mail/iCloud with an ATT DSL system. I have my own domain using IMAP as well as a .me account using Mail.app.
    Waiting to hear when I can remote login to look at things.
    Another thought is to backup his mailbox, rebuild, and then do a big purge of his inbox. His work pattern is such that he leaves way too much in his inbox (4K+ messages). I've counseled him to change. If the system is getting corrupted maybe this is a symptom?
    Also not sure if he is at 10.7.4-I'm not going there yet due to some nasty issues with the Thunderboldt upgrade released last week.
    Thanks

  • How do I create an Event Handler for an Execute SQL Task in SSIS if its result set is empty

    So the precedence on my entire package executing is based on my first SELECT of my Table and an updatable column. If that SELECT results in an empty result set, how do I create an Event Handler to handle an empty result set?
    A Newbie to SSIS.
    I appreciate your review and am hopeful for a reply.
    PSULionRP

    Depends upon what you want to do in the eventhandler. this is what you can do
    Store the result set from the Select to a user variable.
    Pass this user variable to a Script task.
    In the Script task do whatever you want to do including failing the package this can be done by failing the script task, which in turns fails the package. something like
    Dts.TaskResult = Dts.Results.Failure
    Abhinav http://bishtabhinav.wordpress.com/

  • Stored procedure that returns a cursor (result set)

    Hi,
    We have a stored procedure that returns a cursor (result set) but when I compliled it and catalouged (introspected) it in the OBPM I got all the primitive type parameters (either IN or OUT) in the proc call except the cursor type (the result set) which is the out param of the stored proc.
    Any pointers please?
    Thanks

    Result set is of RowType and is not supported as a Stored Procedure as far as I know.
    HTH
    Sharma

  • Help with streaming result sets and prepared statements

    hi all
    I create a callable statement that is capable of streaming.
    statement = myConn2.prepareCall("{call graphProc(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}",java.sql.ResultSet.TYPE_FORWARD_ONLY,
    java.sql.ResultSet.CONCUR_READ_ONLY);
    statementOne.setFetchSize(Integer.MIN_VALUE);
    the class that contains the query is instantiated 6 times the first class streams the results beautifully and then when the second
    rs = DatabaseConnect.statementOne.executeQuery();
    is executed I get the following error
    java.sql.SQLException: Can not use streaming results with multiple result statements
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1370)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1688)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3031)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:943)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1049)
    at com.mysql.jdbc.CallableStatement.executeQuery(CallableStatement.java:589)
    the 6 instances are not threaded and the result set is closed before the next query executes is there a solution to this problem it would be greatly appreciated
    thanks a lot
    Brian

    Database resources should have the narrowed scope
    possible. I don't think it's a good idea to use a
    ResultSet in a UI to generate a graph. Load the data
    into an object or data structure inside the method
    that's doing the query and close the ResultSet in a
    finally block. Use the data structure to generate
    the graph.
    It's an example of MVC and layering.
    Ok that is my bad for not elaborating on the finer points sorry, the results are not directly streamed into the graphs from the result set. and are processed in another object and then plotted from there.
    with regards to your statement in the beginning I would like to ask if you think it at least a viable option to create six connections. with that said would you be able to give estimated users using the six connections under full usage.
    just a few thoughts that I want to
    bounce off you if you don't mind. Closing the
    statement would defeat the object of of having a
    callable statement How so? I don't agree with that.
    %again I apologise I assumed that since callable statements inherit from prepared statements that they would have the pre compiled sql statement functionality of prepared statements,well If you consider in the example I'm about to give maybe you will see my point at least with regards to this.
    The statement that I create uses a connection and is created statically at the start of the program, every time I make a call the same statement and thus connection is used, creating a new connection each time takes up time and resources. and as you know every second counts
    thanks for your thoughts
    Brian.

  • How to disable Switch Profile and Auxilliary Metadata set on UCM checkin screen?

    We are using webcenter content 11.1.1.6 with Record Management component installed on top of it
    While trying to checkin a new document from a normal checkin screen or from Manage attachments screen two options come at the top 'Switch Profile and Auxilliary Metadata set'
    How can these options be disabled?

    Hi,
    The xExternalDataSet is already an empty string on the check in page
    When i append &IsJava=1, the variables have these values
    xExternalDataSet=
    xExternalDataSet:isInfoOnly=1
    xExternalDataSet:isSetDefault=1
    Isn't there a config variable for this, as I see this component has come as part of record management but no option to disable when I configure record management
    Thanks,
    Gaurav

  • SCROLL_SENSITIVE result set can't see the data inserted.

    hi all ,
    I am trying to display all the latest data available in the table through SCROLL_SENSITIVE and UPDATABLE result set after inserting a new record in the table.
    But the result set obtained after executing the query initially is not able to see the newly inserted record in the table and hence same result is getting printed out in both the cases.
    Can u explain me what's happening in this case ?? And how can i get the updated record also without executing the statement query twice to get the latest result set.
    My full code is given below.
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class Misc3 {
    public static void main(String[] args) {
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
    int empid;
    String lname;
    String fname;
    int deptno;
    int mngrid;
    con = JDBCUtil.getOracleConnection();
    stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
    String query = "select employee_id , last_name , first_name , department_number , manager_id from employees ";
    rs = stmt.executeQuery(query);
    System.out.println("Before inserting the new record.....");
    while (rs.next()) {
    empid = rs.getInt(1);
    lname = rs.getString(2);
    fname = rs.getString(3);
    deptno = rs.getInt(4);
    mngrid = rs.getInt(5);
    System.out.println(empid + "\t" + lname + "\t" + fname + "\t" + deptno + "\t" + mngrid);
    System.out.println("Going to insert the new record.....");
    rs.moveToInsertRow();
    rs.updateInt(1, 10);
    rs.updateString(2, "Clark");
    rs.updateString(3, "John");
    rs.updateInt(4, 2);
    rs.updateInt(5, 2);
    rs.insertRow();
    System.out.println("New record inserted successfully.....");
    System.out.println("After inserting the new record.....");
    rs.beforeFirst();
    while (rs.next()) {
    empid = rs.getInt(1);
    lname = rs.getString(2);
    fname = rs.getString(3);
    deptno = rs.getInt(4);
    mngrid = rs.getInt(5);
    System.out.println(empid + "\t" + lname + "\t" + fname + "\t" + deptno + "\t" + mngrid);
    } catch (SQLException ex) {
    System.out.println("error code : " + ex.getErrorCode());
    System.out.println("error message : " + ex.getMessage());
    } finally {
    JDBCUtil.cleanUp(con, stmt);
    *** JDBCUtil Class ****
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    public class JDBCUtil {
    public static Connection getOracleConnection(){
    Connection con = null;
    try{
    // Load the driver
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //Establish Connection
    con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","ex","ex");
    }catch(Exception ex){
    ex.printStackTrace();
    return con;
    public static void cleanUp (Connection con , Statement stmt){
    // Release the resource
    try{
    if(con != null){
    con.close();
    if(stmt != null){
    stmt.close();
    }catch(Exception ex){
    ex.printStackTrace();
    Edited by: user12848632 on Aug 13, 2012 2:06 PM

    >
    Can u explain me what's happening in this case ?? And how can i get the updated record also without executing the statement query twice to get the latest result set.
    >
    Sure - but you could have answered your own question if you had read the doc link I gave you in your other thread and next time you post code use \ tags on the lines before and after the code - see the FAQ for info
    17076 : Invalid operation for read only resultset
    {quote}
    •Internal INSERT operations are never visible, regardless of the result set type.
    {quote}
    See •Seeing Database Changes Made Internally and Externally in the JDBC Dev doc I pointed you to
    http://docs.oracle.com/cd/B28359_01/java.111/b31224/resltset.htm#i1024720
    Did you notice the words 'never visible'? You won't see them as part of the result set unless you requery.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • What is open data set and close data set

    what is open data set and close data set,
    how to use the files in sap directories ?

    hi,
    Open Dataset is used to read or write on to application server ... other than that i am not sure that there exists any way to do the same ... here is a short description for that
    FILE HANDLING IN SAP
    Introduction
    • Files on application server are sequential files.
    • Files on presentation server / workstation are local files.
    • A sequential file is also called a dataset.
    Handling of Sequential file
    Three steps are involved in sequential file handling
    • OPEN
    • PROCESS
    • CLOSE
    Here processing of file can be READING a file or WRITING on to a file.
    OPEN FILE
    Before data can be processed, a file needs to be opened.
    After processing file is closed.
    Syntax:
    OPEN DATASET <file name> FOR {OUTPUT/INPUT/APPENDING}
    IN {TEXT/BINARY} MODE
    This statement returns SY_SUBRC as 0 for successful opening of file or 8, if unsuccessful.
    OUTPUT: Opens the file for writing. If the dataset already exists, this will place the cursor at the start of the dataset, the old contents get deleted at the end of the program or when the CLOSE DATASET is encountered.
    INPUT: Opens a file for READ and places the cursor at the beginning of the file.
    FOR APPENDING: Opens the file for writing and places the cursor at the end of file. If the file does not exist, it is generated.
    BINARY MODE: The READ or TRANSFER will be character wise. Each time ‘n’’ characters are READ or transferred. The next READ or TRANSFER will start from the next character position and not on the next line.
    IN TEXT MODE: The READ or TRANSFER will start at the beginning of a new line each time. If for READ, the destination is shorter than the source, it gets truncated. If destination is longer, then it is padded with spaces.
    Defaults: If nothing is mentioned, then defaults are FOR INPUT and in BINARY MODE.
    PROCESS FILE:
    Processing a file involves READing the file or Writing on to file TRANSFER.
    TRANSFER Statement
    Syntax:
    TRANSFER <field> TO <file name>.
    <Field> can also be a field string / work area / DDIC structure.
    Each transfer statement writes a statement to the dataset. In binary mode, it writes the length of the field to the dataset. In text mode, it writes one line to the dataset.
    If the file is not already open, TRANSFER tries to OPEN file FOR OUTPUT (IN BINARY MODE) or using the last OPEN DATASET statement for this file.
    IF FILE HANDLING, TRANSFER IS THE ONLY STATEMENT WHICH DOES NOT RETURN SY-SUBRC
    READ Statement
    Syntax:
    READ DATASET <file name> INTO <field>.
    <Field> can also be a field string / work area / DDIC structure.
    Each READ will get one record from the dataset. In binary mode it reads the length of the field and in text mode it reads each line.
    CLOSE FILE:
    The program will close all sequential files, which are open at the end of the program. However, it is a good programming practice to explicitly close all the datasets that were opened.
    Syntax:
    CLOSE DATASET <file name>.
    SY-SUBRC will be set to 0 or 8 depending on whether the CLOSE is successful or not.
    DELETE FILE:
    A dataset can be deleted.
    Syntax:
    DELETE DATASET <file name>.
    SY-SUBRC will be set to 0 or 8 depending on whether the DELETE is successful or not.
    Pseudo logic for processing the sequential files:
    For reading:
    Open dataset for input in a particular mode.
    Start DO loop.
    Read dataset into a field.
    If READ is not successful.
    Exit the loop.
    Endif.
    Do relevant processing for that record.
    End the do loop.
    Close the dataset.
    For writing:
    Open dataset for output / Appending in a particular mode.
    Populate the field that is to be transferred.
    TRANSFER the filed to a dataset.
    Close the dataset.
    Regards
    Anver
    if hlped pls mark points

Maybe you are looking for