Creating cursor using Execute immediate
I am trying to create one cursor using a for loop, but I am not able to do so, could you please help me with the approach to get it done.
Here is the scenario:
I have one table table_1,it contains 2 columns source_query , target_query.
source_query and target_query are Select statements like source_query is Select name, age , valid from customer where customer_id=123456;
I fetched the data from these columns into 2 strings
select source_query into source_data from table_1;
select target_query into target_data from table_1;
Now out of these 2 I want to create 2 cursors, so that I can compare the column values one by one ( I am not using the source minus target approach because of difference in the data type).
I have to individually check the values.
So here are the cursors:
For source_data_value in ( EXECUTE immediate source_data)
LOOP
For target_data_value in (EXECUTE IMMEDIATE target_data)
LOOP
<executable statements>;
END LOOP;
END LOOP;
But the cursor creation is failing in the procedure.
Please let me know if it is possible to create a cursor using the execute immediate , if not what approach I should use other than this?
Why exactly you are doing this inside a procedure. You can take the SQL's out and write a simple query to retrieve the data. Anyways, to work it out in a procedure, I can think of the below solution. I am trying to do away with Execute Immediate and use REF cursor. Please note that this is untested and just a try to present a possible solution which can be changed to implement your original requirement. I haven't done anything sort of this before, so if this approach doesn't approach, kindly ignore
DECLARE
TYPE TempTyp IS REF CURSOR;
temp_cv TempTyp;
temp_cv_2 Temptyp;
emp_rec emp%ROWTYPE;
source_data VARCHAR2(200);
target_data VARCHAR2(200);
BEGIN
source_data:= 'SELECT * FROM source tablej';
target_Date :='select * from target table';
OPEN temp_cv FOR source_data;
LOOP
FETCH temp_cv INTO emp_rec;
EXIT WHEN emp_cv%NOTFOUND;
OPEN temp_cv_2 FOR target_data;
FETCH Temp_cv_2 into emp_rec emp%ROWTYPE
loop
< And then your comparisons here >
END LOOP:
CLOST TEMP_CV_2;
END LOOP;
CLOSE temp_cv;
END;
Ishan
Similar Messages
-
Can we create cursor using the table created dynamically
Dear all,
Can we create the cursor using the table which is created dynamically using "Execute immediate" within the same procedure,
or is there any way to call the table created dynamically ..
please Do Help me in this
thanks alot
Edited by: khaja on Jan 18, 2009 10:57 AMWell, I don't think this approach is bad in any possible circumstances. It depends on the requirements we don't know. Yes, usually applications should not be designed in this way. But 'usually' does not mean 'never'. One possible case is described in Oracle's example Referencing Database Objects that Do Not Exist at Compilation. It's possible to assume that tables inv_01_2003, inv_04_2003, etc from the referenced topic What Is Dynamic SQL? are generated automatically by some job using dynamic create table stmt. If the OP has similar requirements tnen this approach is not bad. It may not be the best one but it at least is not so bad as you said.
I believe that OPs know their requirements much better than me. This is why I always try to answer the exact question. If the approach is really ugly then I don't answer such questions at all.
Regards,
Dima
Message was edited by:
DimaCit -
Create temp table using EXECUTE IMMEDIATE
Is there any performance issue in creating globally temp table
using EXECUTE IMMEDIATE or creating globally temp table from
SQL PLUS.
Any response will be greatly appreciated.
nullAnish,
Creating tables is likely to be an expensive operation.
Performance issues can only be considered in comparison to
alternatives.
Alternatives include: PLSQL tables, cursors and/or recoding so
that tmp tables are not required. (One of our consultants reckons
that sqlserver temp tables are usually used to get around
limitations in sqlserver, ie slightly more complicated sql
statements could be used instead of simpler sql and temporary
tables).
I would think creating the temp table once during sqlplus would
be cheaper than creating and deleting it repeatedly at run time.
Note that EXECUTE IMMEDIATE may do an implicit commit (dbms_sql
certainly does). This may be got over my using the PRAGMA
AUTONOMOUS_TRANSACTION; direction which places a
procedure/function in a seperate transaction.
Turloch
P.S. We have some difficulty in getting information back from the
field/customer sites. If you have questions and answers that are
likely to be useful to other Oracle Migration Workbench
users, and migrators in general, please send them in for possible
inclusion in our Frequently Asked Question list.
Oracle Migration Workbench Team
Anish (guest) wrote:
: Is there any performance issue in creating globally temp table
: using EXECUTE IMMEDIATE or creating globally temp table from
: SQL PLUS.
: Any response will be greatly appreciated.
Oracle Technology Network
http://technet.oracle.com
null -
How to use Execute Immediate to execute a procedure and return a cursor?
The procedure name is unknown until run time so I have to use Execute immediate to execute the procedure, the procedure return a cursor, but I can't figure out the right syntax to pass the cursor out.
To simplify the issue here, I create two procedures as examples.Assume I have a procedure called XDTest:
p_cur OUT SYS_REFCURSOR
IS
BEGIN
OPEN p_cur FOR
Select * from dummy_table;
END XDTest;
In another procedure, I want to use Execute Immediate to execute XDTest and obtain the result that return from the cursor into a local cursor so I can process the records:
p_cur OUT SYS_REFCURSOR
IS
l_cur SYS_REFCURSOR;
BEGIN
execute immediate 'BEGIN XDTest (:1); END;' using OUT l_cur;
END XDTest2;
However, this is not working, I get ORA-03113: end-of-file on communication channel error.
What syntax should I use here?
Cheerswell...
I update the XDTest2 procedure as below but when execute it get exceptions.I think the v_sqlstmt syntax is wrong, but I don't know what meant to be correct, please give some suggestions .
Cheers
-------------------- XDTest procedure --------------------------------------------------
p_cur OUT SYS_REFCURSOR
--AUTHID CURRENT_USER
IS
BEGIN
OPEN p_cur FOR
Select Table_Name from USER_Tables;
END XDTest;
-------------------- XDTest2 procedure --------------------------------------------------
p_cur OUT SYS_REFCURSOR
IS
TYPE T1 IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER ;
v_sqlstmt varchar2(1000):=null;
v_cursor number;
x_num number;
LN$Lig number := 0 ;
LN$MaxCol number := 0 ;
t T1 ;
v VARCHAR2(4000) ;
userTb User_Tables%ROWTYPE;
l_cur number;
BEGIN
LN$Lig := 0 ;
LN$MaxCol := 1 ;
--OPEN p_cur FOR
--execute immediate 'BEGIN XDTest (:1); END;' using OUT l_cur;
v_cursor:=dbms_sql.open_cursor;
v_sqlstmt:='begin :p_cur:="XDTest"(); END; ';
dbms_sql.parse(v_cursor,v_sqlstmt,DBMS_SQL.NATIVE);
dbms_sql.bind_variable(v_cursor,':p_cur',l_cur);
dbms_output.put_line('1');
-- Define the columns --
dbms_sql.DEFINE_COLUMN(v_cursor, 1, userTb.Table_Name, 30);
x_num:=dbms_sql.execute(v_cursor);
dbms_output.put_line('2');
-- Fetch the rows from the source query --
LOOP
IF dbms_sql.FETCH_ROWS(v_cursor)>0 THEN
-- get column values of the row --
dbms_sql.COLUMN_VALUE(v_cursor, 1,userTb.Table_Name);
dbms_output.put_line(userTb.Table_Name);
ELSE
-- No more rows --
EXIT;
END IF;
END LOOP;
dbms_sql.close_cursor(v_cursor);
END XDTest2;
---------------------- Error when execute ------------------------------------------------
1
BEGIN DevD0DB.XDTest2(:l_cur); END;
ERROR at line 1:
ORA-01007: variable not in select list
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1010
ORA-06512: at "SYS.DBMS_SQL", line 212
ORA-06512: at "DEVD0DB.XDTEST2", line 35
ORA-06512: at line 1
---------------------------------------------------------------------------------------------------- -
Using execute immediate creating a table from another
hi friend i wanted to create a table from a select statement in a pl sql procedure. i am using execute immediate but getting problems with it pls can anyone help me.
here is the query i am using
EXECUTE IMMEDIATE 'CREATE TABLE table_name AS (SELECT * FROM a_view WHERE column_name LIKE '%some_string%');
i need to know if this can be done and if yes how. pls help me its bit urgent too. the schema name is same and the privileges are available to create tables too.Your syntax is wrong.
If you would use a syntax higlighted editor, it would show.
Yout try to execute a string where another string is embedded. Please use two times single quote or use the 'q' function:
This one is correct:
EXECUTE IMMEDIATE 'CREATE TABLE table_name AS (SELECT * FROM a_view WHERE column_name LIKE ''%some_string%'')';
or this one:
EXECUTE IMMEDIATE q'|CREATE TABLE table_name AS (SELECT * FROM a_view WHERE column_name LIKE '%some_string%')|';
good luck -
CREATE TEMPORARY TABLE USING EXECUTE IMMEDIATE
Hi All,
i have a question,
how can i create a temporary table using EXECUTE IMMEDIATE ??
Like:
CREATE GLOBAL TEMPORARY table new_table as (Select * from old_table);
Thanks,
Edited by: xDeviates on Jun 11, 2012 3:13 PMIt looks like you are approaching the problem incorrectly. As I suggested in Dynamic Select, it sounds like you, at most, want a function that returns a SYS_REFCURSOR (it's still not obvious to me why you would even want/ need to resort to dynamic SQL in the first place)
CREATE OR REPLACE FUNCTION get_dynamic_cursor( p_table_name IN VARCHAR2 )
RETURN sys_refcursor
IS
l_rc sys_refcursor;
BEGIN
OPEN l_rc FOR 'SELECT * FROM ' || dbms_assert.sql_object_name( p_table_name );
RETURN l_rc;
END;which you can then call from your application
SQL> variable rc refcursor;
SQL> exec :rc := get_dynamic_cursor( 'EMP' );
PL/SQL procedure successfully completed.
SQL> print rc
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7369 SMITH CLERK 7902 17-DEC-80 801
20
7499 ALLEN SALESMAN 7698 20-FEB-81 1601 300
30
7521 WARD SALESMAN 7698 22-FEB-81 1251 500
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7566 JONES MANAGER 7839 02-APR-81 2976
20
7654 MARTIN SALESMAN 7698 28-SEP-81 1251 1400
30
7698 BLAKE MANAGER 7839 01-MAY-81 2851
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7782 CLARK MANAGER 7839 09-JUN-81 2451
10
7788 SCOTT ANALYST 7566 19-APR-87 3001
20
7839 KING PRESIDENT 17-NOV-81 5001
10
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7844 TURNER SALESMAN 7698 08-SEP-81 1501 0
30
7876 ADAMS CLERK 7788 23-MAY-87 1101
20
7900 JAMES CLERK 7698 03-DEC-81 951
30
EMPNO ENAME JOB MGR HIREDATE SAL COMM
DEPTNO
7902 FORD ANALYST 7566 03-DEC-81 3001
20
7934 MILLER CLERK 7782 23-JAN-82 1301
10
14 rows selected.Justin -
Create Partition tables in PL/SQL using Execute Immediate
Hi
I have to create a partiton table in PL/SQL using Execute Immediate. I concat the necessary Create Table syntax into a variable and use Execute Immediate variable name. This gives a error ORA-00900: invalid SQL statement. However if i cut and paste the SQL statement from DBMS_OUTPUT, the table creation goes through without any problem.
What could be the issue. Has anyone face this before please.
I am using 10G DBThanks for your reply. It is a big code. I am pasting the part required.
v_sqlstmtout :='CREATE TABLE a_10(MYDATE DATE NOT NULL,ID NUMBER(14) NOT NULL)';
v_sqlstmtout := v_sqlstmtout || ' PARTITION BY RANGE (MYDATE) ';
v_sqlstmtout := v_sqlstmtout || 'SUBPARTITION BY HASH(id) ';
v_sqlstmtout := v_sqlstmtout || 'SUBPARTITION TEMPLATE(';
v_sqlstmtout := v_sqlstmtout || 'SUBPARTITION SP1,SUBPARTITION SP2) ';
v_sqlstmtout := v_sqlstmtout || '(PARTITION mth_dummy VALUES LESS THAN ';
v_sqlstmtout := v_sqlstmtout || '('||V_SQLSTMT3||')' || v_sqlstmt||')';
EXECUTE IMMEDIATE ''''||v_sqlstmtout||'''';
variables are substituted through data from different tables.
The output looks like the following
CREATE TABLE a_10(MYDATE DATE NOT NULL,ID NUMBER(14) NOT NULL)
PARTITION BY RANGE (mydate) SUBPARTITION BY HASH(id) SUBPARTITION
TEMPLATE(SUBPARTITION SP1,SUBPARTITION SP2) (PARTITION mth_dummy VALUES
LESS THAN ('01-MAY-2006'), PARTITION mth_JAN2007 VALUES LESS THAN
('01-FEB-2007'))
The above is the output from DBMS_OUTPUT. If i run this statement the table is created. Please help.. -
How to use cursor in EXECUTE IMMEDIATE command.
i.e. I have a dynamic SELECT query where I will get huge records while using EXECUTE IMEDIATE command, which I want that to be in a cursor.
Can I do this ? If yes how ?Hi, it works perferctly fine with me. Oracle version 10.2.0.4
SQL> --create table t as select * from user_objects; ----->>> My mistake, there is no owner column in the table user_objects
SQL> create table t as select * from all_objects;
Table created.
SQL> CREATE OR REPLACE PROCEDURE dynamic_table (
2 table_name IN VARCHAR2,
condition IN VARCHAR2 DEFAULT NULL) AS
3 4 where_clause VARCHAR2(100) := ' WHERE ' || condition;
5 v_table varchar2(30);
6 type v_typet is table of t%rowtype index by pls_integer;
7 v_tableT v_typeT;
8 BEGIN
-- first make sure that the table actually exists; if not, raise an exception
SELECT OBJECT_NAME INTO v_table FROM USER_OBJECTS
9 10 11 where object_name = upper(table_name) and object_type = 'TABLE';
if condition is null then where_clause := ' order by object_type'; end if;
12 13 execute immediate 'SELECT * from ' || v_table || where_clause bulk collect into v_tablet;
14 for indx in 1..v_tablet.count loop
dbms_output.put_line(v_tablet(indx).owner || ' ' || v_tablet(indx).status);
15 16 end loop;
17 EXCEPTION
18 when no_data_found then
19 dbms_output.put_line ('Invalid table: ' || table_name);
20 end;
21 /
Procedure created.
begin
dynamic_table('T', '');
--Enter the table name you want for the 1st parameter and the condition for the second parameter.
--I think you just want to switch from tables where you want to select.
end;
/Edited by: Spongebob on May 25, 2010 1:33 PM -
Error while insert data using execute immediate in dynamic table in oracle
Error while insert data using execute immediate in dynamic table created in oracle 11g .
first the dynamic nested table (op_sample) was created using the executed immediate...
object is
CREATE OR REPLACE TYPE ASI.sub_mark AS OBJECT (
mark1 number,
mark2 number
t_sub_mark is a class of type sub_mark
CREATE OR REPLACE TYPE ASI.t_sub_mark is table of sub_mark;
create table sam1(id number,name varchar2(30));
nested table is created below:
begin
EXECUTE IMMEDIATE ' create table '||op_sample||'
(id number,name varchar2(30),subject_obj t_sub_mark) nested table subject_obj store as nest_tab return as value';
end;
now data from sam1 table and object (subject_obj) are inserted into the dynamic table
declare
subject_obj t_sub_mark;
begin
subject_obj:= t_sub_mark();
EXECUTE IMMEDIATE 'insert into op_sample (select id,name,subject_obj from sam1) ';
end;
and got the below error:
ORA-00904: "SUBJECT_OBJ": invalid identifier
ORA-06512: at line 7
then when we tried to insert the data into the dynam_table with the subject_marks object as null,we received the following error..
execute immediate 'insert into '||dynam_table ||'
(SELECT887684 wrote:
ORA-00904: "SUBJECT_OBJ": invalid identifier
ORA-06512: at line 7The problem is that your variable subject_obj is not in scope inside the dynamic SQL you are building. The SQL engine does not know your PL/SQL variable, so it tries to find a column named SUBJECT_OBJ in your SAM1 table.
If you need to use dynamic SQL for this, then you must bind the variable. Something like this:
EXECUTE IMMEDIATE 'insert into op_sample (select id,name,:bind_subject_obj from sam1) ' USING subject_obj;Alternatively you might figure out to use static SQL rather than dynamic SQL (if possible for your project.) In static SQL the PL/SQL engine binds the variables for you automatically. -
Selecting data from a table using Execute Immediate in 9i
Hi,
I was wondering how I would be able to do a SELECT on a table using EXECUTE IMMEDIATE. When I tried it (with the proc below), I got the following below. Can anyone tell me what I am doing wrong?
Using Scott/Tiger I tried this:
SQL> ed
Wrote file afiedt.buf
1 CREATE OR REPLACE PROCEDURE P2
2 IS
3 v_SQL VARCHAR2(100);
4 BEGIN
5 v_SQL := 'Select * from Emp';
6 EXECUTE IMMEDIATE v_SQL;
7* END;
SQL> /
Procedure created.
SQL> exec p2
PL/SQL procedure successfully completed.
SQL> set serveroutput on
SQL> exec p2
PL/SQL procedure successfully completed.
SQL>
Thanks in advance.
Sincerely,
Nikhil Kulkarni1 CREATE OR REPLACE PROCEDURE P2
2 IS
3 v_SQL VARCHAR2(100);
erec emp%rowtype;
4 BEGIN
5 v_SQL := 'Select * from Emp';
6 EXECUTE IMMEDIATE v_SQL into erec;
7* END;
SQL> / -
Oracle 11G Copying a table using execute immediate
I want to copy the contents of one table into another using execute immediate.
This keeps failing with the following error
ORA-00903: invalid table name
ORA-06512: at "TABLE_COPY", line 6
ORA-06512: at line 8
create or replace
procedure TABLE_COPY(
TABLE1 varchar2,
TABLE2 varchar2)
is
begin
execute immediate 'insert into '||TABLE2||' (select * from '||TABLE1||')';
end;
Edited by: user9213000 on 24-Jan-2013 07:38user9213000 wrote:
I want to copy the contents of one table into another using execute immediate.
This keeps failing with the following error
ORA-00903: invalid table name
ORA-06512: at "TABLE_COPY", line 6
ORA-06512: at line 8
create or replace
procedure TABLE_COPY(
TABLE1 varchar2,
TABLE2 varchar2)
is
begin
execute immediate 'insert into '||TABLE2||' (select * from '||TABLE1||')';
end;
Edited by: user9213000 on 24-Jan-2013 07:38The standard advice when (ab)using EXECUTE IMMEDIATE is to compose the SQL statement in a single VARCHAR2 variable
Then print the variable before passing it to EXECUTE IMMEDIATE.
COPY the statement & PASTE into sqlplus to validate its correctness. -
Problem in Update statement using Execute Immediate
Hi All,
I am facing problem in update statement.
I am creating dynamic sql and use "execute immediate" statement to execute a update statement.
But it is not updating any thing there in the table.
I have created a query like :
update_query='Update '|| Table_Name ||' t set t.process_status =''Y'' where t.tid=:A';
Execute immediate update_query using V_Id;
commit;
But it is not updating the table.
I have a question , is execute immediate only does insert and delete?
Thanks
AshokSQL> select * from t;
TID P
101 N
SQL> declare
2 V_Id number := 101;
3 Table_Name varchar2(30) := 'T';
4 update_query varchar2(1000);
5 begin
6 update_query := 'Update '|| Table_Name ||' t set t.process_status =''Y'' where t.tid=:A';
7 Execute immediate update_query using V_Id;
8 commit;
9 end;
10 /
PL/SQL procedure successfully completed.
SQL> select * from t;
TID P
101 Y -
Using EXECUTE IMMEDIATE for DML
What benefit is there to use EXECUTE IMMEDIATE for an UPDATE statement like the one below.
EXECUTE IMMEDIATE 'UPDATE mytable SET bonus = v_bonus(i)
WHERE empid =:empid AND sal =:sal'
USING v_empid(n),v_sal(i);This UPDATE sql is not dynamically created. So is there any performance benefit associated with using
EXECUTE IMMEDIATE for this UPDATE? Can't i just use a normal UPDATE without EXECUTE IMMEDIATE?Ran these same tests with SQL_Trace turned on, ran the trace files through tkprof and look at what it tells us:
declare
begin
for i in 1 .. 100000 loop
gso_prueba_a();
end loop;
end;
call count cpu elapsed disk query current rows
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.07 0.08 0 0 0 1
Fetch 0 0.00 0.00 0 0 0 0
total 2 0.07 0.08 0 0 0 1Now a slow one
declare
begin
for i in 1 .. 100000 loop
execute immediate 'call gso_prueba_b()';
end loop;
end;
call count cpu elapsed disk query current rows
Parse 1 0.00 0.00 0 0 0 0
Execute 1 36.07 36.54 0 0 0 1
Fetch 0 0.00 0.00 0 0 0 0
total 2 36.07 36.54 0 0 0 1but with this slow one, we see LOTS of recursive SQL - the 'call gso_prueba_b' is getting parsed a gazillion times with the resulting CPU consumption
SQL ID : 1uu09hhqdp1yz
call gso_prueba_b()
call count cpu elapsed disk query current rows
Parse 1 0.00 0.00 0 0 0 0
Execute 99989 2.42 2.72 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
total 99990 2.42 2.72 0 0 0 0
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 91 (recursive depth: 1)
SQL ID : dcstr36r0vz0d
select procedure#,procedurename,properties,itypeobj#
from
procedureinfo$ where obj#=:1 order by procedurename desc, overload# desc
call count cpu elapsed disk query current rows
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 4 0 1
total 4 0.00 0.00 0 4 0 1Lots, lots more like this last one but having different SQL ID
By wrapping the procedure call in a dynamically created anonymous block, you are incurring LOTS of overhead.
What is it that you are trying to simulate.
What are you trying to do? -
Using execute immediate in form
hi all
how can I use Execute Immediate In form It give me error but In sql no error
thank youThere are two options.
1. FORMS DDL
2. Call a backend function or procedure which has got EXECUTE_IMMEDIATE in it.
Following procedure can be used to execute the dymanic sql in forms.
Create this procedure in backend.
CREATE OR REPLACE PROCEDURE pr_execute_immediate (p_sql_stmt VARCHAR2) IS
BEGIN
EXECUTE_IMMEDIATE(p_sql_stmt );
END pr_execute_immediate;
Edited by: Narayan H on Jun 2, 2010 4:00 AM
Edited by: Narayan H on Jun 2, 2010 4:03 AM
Edited by: Narayan H on Jun 2, 2010 4:05 AM -
Andydata.getObject in piecewise mode using execute immediate statement err
andydata.getObject in piecewise mode using execute immediate statement
will get ora-00600 arguments:[kopuigpfx1], [14] in Oracle 11.1.0.6 and Oralce 10.2.0.2.
andydata.getObject in piecewise mode using execute immediate statement err
andydata.getObject in piecewise mode using execute immediate statement will get ora-00600 arguments:[kopuigpfx1], [14] in Oracle 11.1.0.6 and Oralce 10.2.0.x
The following are test scripts in HR schema.
create type ob_test is object(c1 varchar2(10));
script 1: not using execute immediate statement and works fine.
DECLARE
p_anytype anytype;
p_anydata anydata;
p_value_1 VARCHAR2(4000);
p_value_2 ob_test;
p_result PLS_INTEGER;
BEGIN
anytype.begincreate(dbms_types.typecode_object, p_anytype);
p_anytype.addattr('A1',
dbms_types.typecode_varchar2,
NULL,
NULL,
4000,
NULL,
NULL,
NULL);
p_anytype.addattr('A2',
dbms_types.typecode_object,
NULL,
NULL,
NULL,
NULL,
NULL,
anytype.getpersistent('HR', 'OB_TEST'));
p_anytype.endcreate();
anydata.begincreate(p_anytype, p_anydata);
p_anydata.setvarchar2('abc');
p_anydata.setobject(OB_TEST('abc'));
p_anydata.endcreate;
DECLARE
p_anydata2 anydata := p_anydata;
p_value_1 VARCHAR2(4000);
p_value_2 OB_TEST;
p_result PLS_INTEGER;
BEGIN
p_anydata2.piecewise;
p_result := p_anydata2.getvarchar2(p_value_1);
p_result := p_anydata2.getobject(p_value_2);
END;
END;
script 2: using execute immediate statement will get ora-600
DECLARE
p_anytype anytype;
p_anydata anydata;
p_value_1 VARCHAR2(4000);
p_value_2 ob_test;
p_result PLS_INTEGER;
BEGIN
anytype.begincreate(dbms_types.typecode_object, p_anytype);
p_anytype.addattr('A1',
dbms_types.typecode_varchar2,
NULL,
NULL,
4000,
NULL,
NULL,
NULL);
p_anytype.addattr('A2',
dbms_types.typecode_object,
NULL,
NULL,
NULL,
NULL,
NULL,
anytype.getpersistent('HR', 'OB_TEST'));
p_anytype.endcreate();
anydata.begincreate(p_anytype, p_anydata);
p_anydata.setvarchar2('abc');
p_anydata.setobject(OB_TEST('abc'));
p_anydata.endcreate;
EXECUTE IMMEDIATE 'DECLARE' || chr(10) ||
' p_anydata2 anydata := :1;' || chr(10) ||
' p_value_1 VARCHAR2(4000);' || chr(10) ||
' p_value_2 OB_TEST;' || chr(10) ||
' p_result PLS_INTEGER;' || chr(10) || 'BEGIN' ||
chr(10) || ' p_anydata2.piecewise;' || chr(10) ||
' p_result := p_anydata2.getvarchar2(p_value_1);' ||
chr(10) ||
' p_result := p_anydata2.getobject(p_value_2);' ||
chr(10) || 'END;'
USING p_anydata;
END;
script 3: comment statment "p_result := p_anydata2.getobject(p_value_2);", it works ok.
DECLARE
p_anytype anytype;
p_anydata anydata;
p_value_1 VARCHAR2(4000);
p_value_2 ob_test;
p_result PLS_INTEGER;
BEGIN
anytype.begincreate(dbms_types.typecode_object, p_anytype);
p_anytype.addattr('A1',
dbms_types.typecode_varchar2,
NULL,
NULL,
4000,
NULL,
NULL,
NULL);
p_anytype.addattr('A2',
dbms_types.typecode_object,
NULL,
NULL,
NULL,
NULL,
NULL,
anytype.getpersistent('HR', 'OB_TEST'));
p_anytype.endcreate();
anydata.begincreate(p_anytype, p_anydata);
p_anydata.setvarchar2('abc');
p_anydata.setobject(OB_TEST('abc'));
p_anydata.endcreate;
EXECUTE IMMEDIATE 'DECLARE' || chr(10) ||
' p_anydata2 anydata := :1;' || chr(10) ||
' p_value_1 VARCHAR2(4000);' || chr(10) ||
' p_value_2 OB_TEST;' || chr(10) ||
' p_result PLS_INTEGER;' || chr(10) || 'BEGIN' ||
chr(10) || ' p_anydata2.piecewise;' || chr(10) ||
' p_result := p_anydata2.getvarchar2(p_value_1);' ||
chr(10) ||
' /*p_result := p_anydata2.getobject(p_value_2);*/' ||
chr(10) || 'END;'
USING p_anydata;
END;
Could someone tell me how to solve this problem.
Thanks a lot.
Danielandydata.getObject in piecewise mode using execute immediate statement
will get ora-00600 arguments:[kopuigpfx1], [14] in Oracle 11.1.0.6 and Oralce 10.2.0.2.
andydata.getObject in piecewise mode using execute immediate statement err
andydata.getObject in piecewise mode using execute immediate statement will get ora-00600 arguments:[kopuigpfx1], [14] in Oracle 11.1.0.6 and Oralce 10.2.0.x
The following are test scripts in HR schema.
create type ob_test is object(c1 varchar2(10));
script 1: not using execute immediate statement and works fine.
DECLARE
p_anytype anytype;
p_anydata anydata;
p_value_1 VARCHAR2(4000);
p_value_2 ob_test;
p_result PLS_INTEGER;
BEGIN
anytype.begincreate(dbms_types.typecode_object, p_anytype);
p_anytype.addattr('A1',
dbms_types.typecode_varchar2,
NULL,
NULL,
4000,
NULL,
NULL,
NULL);
p_anytype.addattr('A2',
dbms_types.typecode_object,
NULL,
NULL,
NULL,
NULL,
NULL,
anytype.getpersistent('HR', 'OB_TEST'));
p_anytype.endcreate();
anydata.begincreate(p_anytype, p_anydata);
p_anydata.setvarchar2('abc');
p_anydata.setobject(OB_TEST('abc'));
p_anydata.endcreate;
DECLARE
p_anydata2 anydata := p_anydata;
p_value_1 VARCHAR2(4000);
p_value_2 OB_TEST;
p_result PLS_INTEGER;
BEGIN
p_anydata2.piecewise;
p_result := p_anydata2.getvarchar2(p_value_1);
p_result := p_anydata2.getobject(p_value_2);
END;
END;
script 2: using execute immediate statement will get ora-600
DECLARE
p_anytype anytype;
p_anydata anydata;
p_value_1 VARCHAR2(4000);
p_value_2 ob_test;
p_result PLS_INTEGER;
BEGIN
anytype.begincreate(dbms_types.typecode_object, p_anytype);
p_anytype.addattr('A1',
dbms_types.typecode_varchar2,
NULL,
NULL,
4000,
NULL,
NULL,
NULL);
p_anytype.addattr('A2',
dbms_types.typecode_object,
NULL,
NULL,
NULL,
NULL,
NULL,
anytype.getpersistent('HR', 'OB_TEST'));
p_anytype.endcreate();
anydata.begincreate(p_anytype, p_anydata);
p_anydata.setvarchar2('abc');
p_anydata.setobject(OB_TEST('abc'));
p_anydata.endcreate;
EXECUTE IMMEDIATE 'DECLARE' || chr(10) ||
' p_anydata2 anydata := :1;' || chr(10) ||
' p_value_1 VARCHAR2(4000);' || chr(10) ||
' p_value_2 OB_TEST;' || chr(10) ||
' p_result PLS_INTEGER;' || chr(10) || 'BEGIN' ||
chr(10) || ' p_anydata2.piecewise;' || chr(10) ||
' p_result := p_anydata2.getvarchar2(p_value_1);' ||
chr(10) ||
' p_result := p_anydata2.getobject(p_value_2);' ||
chr(10) || 'END;'
USING p_anydata;
END;
script 3: comment statment "p_result := p_anydata2.getobject(p_value_2);", it works ok.
DECLARE
p_anytype anytype;
p_anydata anydata;
p_value_1 VARCHAR2(4000);
p_value_2 ob_test;
p_result PLS_INTEGER;
BEGIN
anytype.begincreate(dbms_types.typecode_object, p_anytype);
p_anytype.addattr('A1',
dbms_types.typecode_varchar2,
NULL,
NULL,
4000,
NULL,
NULL,
NULL);
p_anytype.addattr('A2',
dbms_types.typecode_object,
NULL,
NULL,
NULL,
NULL,
NULL,
anytype.getpersistent('HR', 'OB_TEST'));
p_anytype.endcreate();
anydata.begincreate(p_anytype, p_anydata);
p_anydata.setvarchar2('abc');
p_anydata.setobject(OB_TEST('abc'));
p_anydata.endcreate;
EXECUTE IMMEDIATE 'DECLARE' || chr(10) ||
' p_anydata2 anydata := :1;' || chr(10) ||
' p_value_1 VARCHAR2(4000);' || chr(10) ||
' p_value_2 OB_TEST;' || chr(10) ||
' p_result PLS_INTEGER;' || chr(10) || 'BEGIN' ||
chr(10) || ' p_anydata2.piecewise;' || chr(10) ||
' p_result := p_anydata2.getvarchar2(p_value_1);' ||
chr(10) ||
' /*p_result := p_anydata2.getobject(p_value_2);*/' ||
chr(10) || 'END;'
USING p_anydata;
END;
Could someone tell me how to solve this problem.
Thanks a lot.
Daniel
Maybe you are looking for
-
My laptop no longer detects my built in webcam
I have an HP G60-635DX notebook. I have a built in webcam which I have used several times before, but now all of a sudden my laptop is not even detecting I have a built in webcam. What to do? I have a Mobile Intel 4 Series Express Webcam. It bum
-
My Ihone 4s is not being recognized by Itunes.There seems to be no connection, the cable i am using is not the problem because itunes will recognize my Ipad2 and Ipod thru it. I have the most current itunes and phone software I need help!
-
Can I reinstall an audio program that I accidentally removed? Does Firefox have an audio program I can use instead?
-
Creating a directory tree with a JTree???
I want to display in a JPanel the directory structure of my disk, like Windows Explorer. I suppose I have to do it with a JTree, isn't it? But do you know how? The default model only takes strings introduced by me. Thank you very much.
-
Shipment - Vehicle master record
Hello i know that in order to mantain the material master record for a vehicle is necessary to use packging material belonging to the category of means of trasport. We need to use the means of transport in shipment and we have to pack all the deliver