the size of the out parameter in the procedure
Hi all:I have a procedure in a pl/sql package like this:
create or replace procedure MyProc (PRM_STR in VHARCHAR2, PRM_OUTSTR OUT VARCHAR2) is
V_TEST VARCHAR2 (100)
Start
+...+
V_STR: = SUBSTR (PRM_STR, 22, 31);
V_TEST: = TRIM (V_STR);
PRM_OUTSTR: = V_TEST;
EXCEPTION
WHILE OTHERS THEN
+....+
myproc end;
When I run it, it always gives me an exception: ORA-06502: PL/SQL: digital or value error: character string buffer too small.
Then I debug him:
V_TEST: = TRIM (V_STR)
is OK.
While PRM_OUTSTR: = V_TEST, it throws this exception.
I was confused, the out parameter in the procedure has a size? How can I set it?
Please help me!
Thank you very much!
You must declare the size of the variable you use in the call to the procedure to be big enough.
The output parameter itself may not be declared with a size:
for example
Your appeal should be something like the following:
declare
v_prmstr varchar2(4000) := 'Your input value';
v_prmoutstr varchar2(4000);
begin
myproc(v_prmstr,v_prmoutstr) ;
end;
v_prmoutstr must be reported to be large enough to contain the value returned by the parameter
PRM_OUTSTR
added example variable
Published by: Keith Jamieson on August 11, 2011 13:32
Tags: Database
Similar Questions
-
What is the maximum size of XMLTYPE OUT Variable in GR 11 2 database.
Hi all
I am writing a procedure that returns data of type XMLTYPE as the OUT parameter.
I want to know how much size maximum XMLTYPE data can use returned using a procedure with a variable output of type XMLTYPE.
Thank you
Madhu K.Hmmm, it is not clear where they got their information to say that an XMLType may be only 4 GB.
http://docs.Oracle.com/CD/E11882_01/server.112/e17118/sql_elements001.htm
http://docs.Oracle.com/CD/E11882_01/server.112/e25513/limits001.htm#REFRN0041XMLType is a type abstract, generally based on the CLOB storage internally, so in principle can store the same amount as a CLOB.
-
Appeal procedure in another procedure using the Out parameter slider - lesson
Hello
I am new to Oracle development so first I wonder if it is a good place with a simple way of the of on how to create stored procedures? I'm looking for the most part at this stage for a quick read.
Second, currently have hacked and slashed my way into getting one built. It has 3 parameters and an output parameter sys_refcursor. This procedure works.
I want to have another created procedure that will call the above procedure and loop through each row in the setting out and write to a file. Can someone point me to an example of this by any chance?
Thanks for the help.
Hello
e28d78d3-c6c6-4BCE-b14f-0f6bf26fa17c wrote:
Thanks for the reply.
Here's what I have, but I'm getting many errors. When I seem to fix one that I get a new one. Kind of like what it show me all questions vs one question at a time. I never know if I create another error of my attempts at fixing what, in my view, could be the problem. In any case, something to get used to.
When you do any type of programming, take baby steps. Write less code as possible, test what you wrote ' worm and, if it contains errors, correct them and test again.
The PL/SQL compiler tries to show all errors, but often it is impossible to say what is a separate mistake, and which is a consequence of a previous error. For example, the DECLARE statements in your code are perfectly valid PL/SQL statements, but they are the mistakes in the sense that they are not what you think, and you may not use them. PL/SQL does not know that (I don't really know that, either, but I'm willing to guess in this case). The works of compiler on the explanation that you really wanted to say SAID, until what it becomes obvious, maybe several lines later, that something makes no sense, but at this time, there is no way he could say that the undesirable DECLARE was the cause.
So here is where I am stuck currently. What I want should first, run the stored procedure and I think I do as you suggest. Which returns data in the output parameter, which is of type sys_refcursor. I think I would need to loop through each element that cursor and output to the file using the dbms_output you reference and like I did below. This should be it. Sounds simple enough, but it's where some of the basics for me.
For example, by creating the procedure some examples have the name of the procedure and then some "AS", "IS". When use the beginning and the end and when not I need?
There is no difference betwwen
CREATE PROCEDURE... AS and
CREATE PROCEDURE... Use IS the one you prefer. You must always one or the other, however.
PL/SQL is written in blocks. The basic structure of a block is
DECLARE - optional, sometimes involved
...
BEGIN
...
-Optional EXCEPTION; forget it for now
...
END;
Almost all of the PL/SQL code is part of a block. In fact, you could argue that anything not in a block isn't really PL/SQL. (For example, CREATE PROCEDURE is really an SQL, PL/SQL not, it indicates the SQL that some PL/SQL compiler is coming.)
You should always BEGIN and END keywords in a PL/SQL block; None is never optional.
I think I'm doing the for loop correctly but I get an error on the portion of loop-end. It is a part of these simple things that become I think that.
That's what I have:
CREATE OR REPLACE PROCEDURE APPS.boact_report_3
AS
DECLARE v_cur SYS_REFCURSOR;
DECLARE v_file_out UTL_FILE.file_type;
BEGIN
I said earlier, DECLARED may be implied. It's one of those places if there is nothing after CREATE PROCEDURE... IS and before STARTING, it is supposed to be a statement.
You can have as many statements (0, 1, 2 or more) that you want in this section of the statement. The semicolon at the end of each of them is all the separation you need each other; you don't need any keyword as STATED.
Open the v_cur for
bo_report (p_sv_id, p_start_date, p_end_date, out v_cur); -stored procedure that girls v_cur witch is a sys_refcursor parameter. It works
END;
BEGIN
Don't forget, how to call a procedure is
bo_report (x, y, z);
not
bo_report (x, y, z OUT);
The key words are only necessary (and only used) in the declaration of a procedure, not in his appeal. When you create a procedure, you decide if each argument is going to be an argument IN, an OUT argument, or IN OUT argument, and you tell the compiler that you decide. When you call a procedure, you have no choice; each argument is IN, OUT or IN OUT has already been decided, and suffice to say compiling what are the variables (or expressions) that you use to play these predetermined roles.
Dbms_output.put_line ('Date: ');
v_file_out: =.
UTL_FILE.fopen (' / public/scripts/smorau02 ', 'w_act.csv', 'W');
FOR x IN v_cur
LOOP
() UTL_FILE.put_line
v_file_out,
x.cl_num | ','
|| x.wa_id | ','
|| x.Description | ','
|| x.a_date | ','
|| x.a_by | ','
|| x.v_Name | ','
|| x.SITE_NAME | ','
|| x.stage | ','
|| x.in_queue);
END LOOP;
UTL_FILE.fclose (v_file_out);
END;
Thanks again for the help.
You have not to send the code to bo_report, so I can't run the procedure. I do not notice any obvious mistakes immediately superior.
-
In passing the huge parameter to oracle procedure have a performance hit?
I have a script attached, in which I am trying process/XML parsing in a table (STAGE_TBL) in the XMLTYPE column and insert the data analyzed in another table (PROCESSED_DATA_TBL). The XML file can be huge up to 2MB, which translates into approximately 2000 + lines of analyzed data. The issue I see is when I pass an XML object to a procedure (STAGE_TBL_PROCESS) to analyze its takes about 10 seconds per XML, but rather than from XML if I directly pick up table in the procedure (STAGE_TBL_PROCESS) passing the ID to be about 0.15 seconds. According to the document while params are passed by reference, so why is this variation of performance?
Details of database Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64-bit version of PL/SQL Production 11.2.0.3.0 - Production "CORE 11.2.0.3.0 Production" TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production
Note: I could not perform SQL_TRACE or DBMS_STATS as I don't have access to them.
/*
This one is taking .15 seconds to process an XML with about 2000 rp_sendRow elements
*/
DECLARE
CURSOR NewStage IS
SELECT *
FROM STAGE_TBL
WHERE status = 'N'
ORDER BY PUT_TIME ASC;
SUBTYPE rt_NewStage IS NewStage % rowtype;
ROW_COUNT INTEGER := 0; -- Return value from calling the procedure
READ_COUNT INTEGER := 0; -- Number of rows read from the stage table
INSERT_COUNT_TOTAL INTEGER := 0; -- Number of Inserts Inven records
ERROR_COUNT INTEGER := 0; -- Number of Inven inserts that did inserted more then 1 row in Inven
PROCESS_STATUS STATUS.MmsStatus;
STATUS_DESCRIPTION STATUS.MmsStatusReason;
ERRMSG VARCHAR2(500);
PROCEDURE STAGE_TBL_PROCESS (IDDATA IN RAW, PROCESS_STATUS OUT VARCHAR2, STATUS_DESCRIPTION OUT VARCHAR2, ROW_COUNT OUT NUMBER) AS
/*
This procedure is to parse the XML from STAGE_TBL and populate the data from XML to PROCESSED_DATA_TBL table
IN PARAMS
----------
IDDATA - ID from STAGE_TBL
xData - XMLType field from XML_DOCUMENT of STAGE_TBL
OUT PARAMS
-----------
PROCESS_STATUS - The STATUS of parsing and populating PROCESSED_DATA_TBL
STATUS_DESCRIPTION - The description of the STATUS of parsing and populating PROCESSED_DATA_TBL
ROW_COUNT - Number of rows inserted into PROCESSED_DATA_TBL
*/
BEGIN
INSERT ALL INTO PROCESSED_DATA_TBL
(PD_ID,
STORE,
SALES_NBR,
UNIT_COST,
ST_FLAG,
ST_DATE,
ST,
START_QTY,
START_VALUE,
START_ON_ORDER,
HAND,
ORDERED,
COMMITED,
SALES,
RECEIVE,
VALUED,
ID_1,
ID_2,
ID_3,
UNIT_PRICE,
EFFECTIVE_DATE,
STATUS,
STATUS_DATE,
STATUS_REASON)
VALUES (IDDATA
,store
,SalesNo
,UnitCost
,StWac
,StDt
,St
,StartQty
,StartValue
,StartOnOrder
,Hand
,Ordered
,COMMITED
,Sales
,Rec
,Valued
,Id1
,Id2
,Id3
,UnitPrice
,to_Date(EffectiveDate||' '||EffectiveTime, 'YYYY-MM-DD HH24:MI:SS')
,'N'
,SYSDATE
,'XML PROCESS INSERT')
WITH T AS
( SELECT STG.XML_DOCUMENT FROM STAGE_TBL STG WHERE STG.ID = IDDATA)
-- This is to parse and fetch the data from XML
SELECT E.* FROM T, XMLTABLE('rp_send/rp_sendRow' PASSING T.XML_DOCUMENT COLUMNS
store VARCHAR(20) PATH 'store'
,SalesNo VARCHAR(20) PATH 'sales'
,UnitCost NUMBER PATH 'cost'
,StWac VARCHAR(20) PATH 'flag'
,StDt DATE PATH 'st-dt'
,St NUMBER PATH 'st'
,StartQty NUMBER PATH 'qty'
,StartValue NUMBER PATH 'value'
,StartOnOrder NUMBER PATH 'start-on-order'
,Hand NUMBER PATH 'hand'
,Ordered NUMBER PATH 'order'
,Commited NUMBER PATH 'commit'
,Sales NUMBER PATH 'sales'
,Rec NUMBER PATH 'rec'
,Valued NUMBER PATH 'val'
,Id1 VARCHAR(30) PATH 'id-1'
,Id2 VARCHAR(30) PATH 'id-2'
,Id3 VARCHAR(30) PATH 'id-3'
,UnitPrice NUMBER PATH 'unit-pr'
,EffectiveDate VARCHAR(30) PATH 'eff-dt'
,EffectiveTime VARCHAR(30) PATH 'eff-tm'
) E;
ROW_COUNT := SQL%ROWCOUNT; -- Not the # of all the rows inserted.
PROCESS_STATUS := STATUS.PROCESSED;
IF ROW_COUNT < 1 THEN -- The insert failed Row Count = 0 No exception thrown
PROCESS_STATUS := STATUS.ERROR;
STATUS_DESCRIPTION := 'ERROR Did not insert into Pos Inventory. Reason Unknown';
END IF;
EXCEPTION
WHEN OTHERS THEN
ROW_COUNT := 0;
PROCESS_STATUS := STATUS.ERROR;
STATUS_DESCRIPTION := 'SqlCode:' || SQLCODE || ' SqlErrMsg:' || SQLERRM;
END;
BEGIN
DBMS_OUTPUT.enable(NULL);
FOR A_NewStage IN NewStage
LOOP
READ_COUNT := READ_COUNT + 1;
STAGE_TBL_PROCESS(A_NewStage.ID, PROCESS_STATUS, STATUS_DESCRIPTION, ROW_COUNT);
INSERT_COUNT_TOTAL := INSERT_COUNT_TOTAL + ROW_COUNT;
IF(ROW_COUNT <= 0 OR PROCESS_STATUS = STATUS.ERROR) THEN
ERROR_COUNT := ERROR_COUNT + 1;
UPDATE STAGE_TBL
SET status = PROCESS_STATUS,
status_DATE = SYSDATE,
status_DESCRIPTION = STATUS_DESCRIPTION
WHERE ID = A_NewStage.ID;
ELSE
UPDATE STAGE_TBL
SET status = PROCESS_STATUS,
status_DATE = SYSDATE,
status_DESCRIPTION = STATUS_DESCRIPTION,
SHRED_DT = SYSDATE
WHERE ID = A_NewStage.ID;
END IF;
COMMIT;
END LOOP;
COMMIT;
IF ERROR_COUNT > 0 THEN
ERRMSG := '** ERROR: ' || ERROR_COUNT || ' Stage records did not insert in to the Processed table correctly';
RAISE_APPLICATION_ERROR(-20001,ErrMsg);
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END ;
/*
This one is taking 10 seconds to process an XML with about 2000 rp_sendRow elements
*/
DECLARE
CURSOR NewStage IS
SELECT *
FROM STAGE_TBL
WHERE status = 'N'
ORDER BY PUT_TIME ASC;
SUBTYPE rt_NewStage IS NewStage % rowtype;
ROW_COUNT INTEGER := 0; -- Return value from calling the procedure
READ_COUNT INTEGER := 0; -- Number of rows read from the stage table
INSERT_COUNT_TOTAL INTEGER := 0; -- Number of Inserts Inven records
ERROR_COUNT INTEGER := 0; -- Number of Inven inserts that did inserted more then 1 row in Inven
PROCESS_STATUS STATUS.MmsStatus;
STATUS_DESCRIPTION STATUS.MmsStatusReason;
ERRMSG VARCHAR2(500);
PROCEDURE STAGE_TBL_PROCESS (IDDATA IN RAW, xData IN STAGE_TBL.XML_DOCUMENT%TYPE, PROCESS_STATUS OUT VARCHAR2, STATUS_DESCRIPTION OUT VARCHAR2, ROW_COUNT OUT NUMBER) AS
/*
This procedure is to parse the XML from STAGE_TBL and populate the data from XML to PROCESSED_DATA_TBL table
IN PARAMS
----------
IDDATA - ID from STAGE_TBL
xData - XMLType field from XML_DOCUMENT of STAGE_TBL
OUT PARAMS
-----------
PROCESS_STATUS - The STATUS of parsing and populating PROCESSED_DATA_TBL
STATUS_DESCRIPTION - The description of the STATUS of parsing and populating PROCESSED_DATA_TBL
ROW_COUNT - Number of rows inserted into PROCESSED_DATA_TBL
*/
BEGIN
INSERT ALL INTO PROCESSED_DATA_TBL
(PD_ID,
STORE,
SALES_NBR,
UNIT_COST,
ST_FLAG,
ST_DATE,
ST,
START_QTY,
START_VALUE,
START_ON_ORDER,
HAND,
ORDERED,
COMMITED,
SALES,
RECEIVE,
VALUED,
ID_1,
ID_2,
ID_3,
UNIT_PRICE,
EFFECTIVE_DATE,
STATUS,
STATUS_DATE,
STATUS_REASON)
VALUES (IDDATA
,store
,SalesNo
,UnitCost
,StWac
,StDt
,St
,StartQty
,StartValue
,StartOnOrder
,Hand
,Ordered
,COMMITED
,Sales
,Rec
,Valued
,Id1
,Id2
,Id3
,UnitPrice
,to_Date(EffectiveDate||' '||EffectiveTime, 'YYYY-MM-DD HH24:MI:SS')
,'N'
,SYSDATE
,'XML PROCESS INSERT')
-- This is to parse and fetch the data from XML
SELECT E.* FROM XMLTABLE('rp_send/rp_sendRow' PASSING xDATA COLUMNS
store VARCHAR(20) PATH 'store'
,SalesNo VARCHAR(20) PATH 'sales'
,UnitCost NUMBER PATH 'cost'
,StWac VARCHAR(20) PATH 'flag'
,StDt DATE PATH 'st-dt'
,St NUMBER PATH 'st'
,StartQty NUMBER PATH 'qty'
,StartValue NUMBER PATH 'value'
,StartOnOrder NUMBER PATH 'start-on-order'
,Hand NUMBER PATH 'hand'
,Ordered NUMBER PATH 'order'
,Commited NUMBER PATH 'commit'
,Sales NUMBER PATH 'sales'
,Rec NUMBER PATH 'rec'
,Valued NUMBER PATH 'val'
,Id1 VARCHAR(30) PATH 'id-1'
,Id2 VARCHAR(30) PATH 'id-2'
,Id3 VARCHAR(30) PATH 'id-3'
,UnitPrice NUMBER PATH 'unit-pr'
,EffectiveDate VARCHAR(30) PATH 'eff-dt'
,EffectiveTime VARCHAR(30) PATH 'eff-tm'
) E;
ROW_COUNT := SQL%ROWCOUNT; -- Not the # of all the rows inserted.
PROCESS_STATUS := STATUS.PROCESSED;
IF ROW_COUNT < 1 THEN -- The insert failed Row Count = 0 No exception thrown
PROCESS_STATUS := STATUS.ERROR;
STATUS_DESCRIPTION := 'ERROR Did not insert into Pos Inventory. Reason Unknown';
END IF;
EXCEPTION
WHEN OTHERS THEN
ROW_COUNT := 0;
PROCESS_STATUS := STATUS.ERROR;
STATUS_DESCRIPTION := 'SqlCode:' || SQLCODE || ' SqlErrMsg:' || SQLERRM;
END;
BEGIN
DBMS_OUTPUT.enable(NULL);
FOR A_NewStage IN NewStage
LOOP
READ_COUNT := READ_COUNT + 1;
STAGE_TBL_PROCESS(A_NewStage.ID, A_NewStage.XML_DOCUMENT, PROCESS_STATUS, STATUS_DESCRIPTION, ROW_COUNT);
INSERT_COUNT_TOTAL := INSERT_COUNT_TOTAL + ROW_COUNT;
IF(ROW_COUNT <= 0 OR PROCESS_STATUS = STATUS.ERROR) THEN
ERROR_COUNT := ERROR_COUNT + 1;
UPDATE STAGE_TBL
SET status = PROCESS_STATUS,
status_DATE = SYSDATE,
status_DESCRIPTION = STATUS_DESCRIPTION
WHERE ID = A_NewStage.ID;
ELSE
UPDATE STAGE_TBL
SET status = PROCESS_STATUS,
status_DATE = SYSDATE,
status_DESCRIPTION = STATUS_DESCRIPTION,
SHRED_DT = SYSDATE
WHERE ID = A_NewStage.ID;
END IF;
COMMIT;
END LOOP;
COMMIT;
IF ERROR_COUNT > 0 THEN
ERRMSG := '** ERROR: ' || ERROR_COUNT || ' Stage records did not insert in to the Processed table correctly';
RAISE_APPLICATION_ERROR(-20001,ErrMsg);
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END ;
My XML with just one rp_sendRow element, it can go upto 2000 rp_sendRow elements
<?xml version = \"1.0\" encoding = \"UTF-8\"?>
<rp_send xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<rp_sendRow>
<store>0123</store>
<sales>022399190</sales>
<cost>0.01</cost>
<flag>true</flag>
<st-dt>2013-04-19</st-dt>
<st>146.51</st>
<qty>13.0</qty>
<value>0.0</value>
<start-on-order>0.0</start-on-order>
<hand>0.0</hand>
<order>0.0</order>
<commit>0.0</commit>
<sales>0.0</sales>
<rec>0.0</rec>
<val>0.0</val>
<id-1/>
<id-2/>
<id-3/>
<unit-pr>13.0</unit-pr>
<eff-dt>2015-06-16</eff-dt>
<eff-tm>09:12:21</eff-tm>
</rp_sendRow>
</rp_send>The issue I see is when I pass an XML object to a procedure (STAGE_TBL_PROCESS) to analyze its takes about 10 seconds per XML, but rather than from XML if I directly pick up table in the procedure (STAGE_TBL_PROCESS) passing the ID to be about 0.15 seconds.
In version 11.1, Oracle introduced a new model of storage for the data type XMLType called XML binary.
Binary XML become the default in 11.2.0.2, to disparage the old storage based on CLOB.
Binary XML is a format optimized after analysis for the storage and treatment of the XQuery.
When an XQuery expression is evaluated (through for example XMLTABLE) on an XMLType column stored as binary XML, Oracle can use an ongoing evaluation of XPath that surpasses the query even crushed a transitional XMLType of several order of magnitude.
You can see that in the action plan of the explain command:
SQL> SELECT E.* 2 FROM stage_tbl t 3 , XMLTABLE('rp_send/rp_sendRow' PASSING t.xml_document 4 COLUMNS store VARCHAR(20) PATH 'store' 5 , SalesNo VARCHAR(20) PATH 'sales' 6 , UnitCost NUMBER PATH 'cost' 7 ) E ; Execution Plan ---------------------------------------------------------- Plan hash value: 1134903869 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2008 | 32 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 1 | 2008 | 32 (0)| 00:00:01 | | 2 | TABLE ACCESS FULL| STAGE_TBL | 1 | 2002 | 3 (0)| 00:00:01 | | 3 | XPATH EVALUATION | | | | | | --------------------------------------------------------------------------------
When the query is executed on a passenger XMLType (for example, a parameter, or a PL/SQL variable), Oracle cannot run the binary model and use a functional assessment based on memory of the XML DOM-like representation.
You can see that in the plan to explain it by spoting a 'COLLECTION ITERATOR PICKLER FETCH' operation.
So what explains the difference (in your version) between treatment from a column of XMLType (stored in binary XML format) or a variable or a parameter.
From 11.2.0.4 and beyond, things have changed a bit with Oracle, introducing a new transitional level of optimization on XMLType.
The plan of the explain command will show a "XMLTABLE ASSESSMENT' in this case.
-
The procedure with parameter output from test object type
I have the sub object created with spec and body type.
I need to test the procedure seen ino parameter object type.
could you please help me test the procedure!
create or replace type typ_obj_test as object ( a_date date, a_type varchar2(10), a_status varchar2(2), descr varchar2(10), a_id number(10), constructor function typ_obj_test(a_date date ,a_type varchar2 default null ,a_status varchar2 default null ,descr varchar2 default null ,a_id number default null) return self as result ); / create or replace type body typ_obj_test is constructor function typ_obj_test(a_date date ,a_type varchar2 default null ,a_status varchar2 default null ,descr varchar2 default null ,a_id number default null) return self as result is v_test varchar2(1); v_id number(10); begin self.a_date := a_date; self.a_type := a_type; self.a_status := a_status; self.descr := descr; self.a_id := a_id; return; end; end; / create or replace procedure p_obj_test(p_obj_param in out typ_obj_test) is begin dbms_output.put_line('Checking the object type' || p_obj_param.a_date || '@' || p_obj_param.a_type || '@' || p_obj_param.a_status || '@' || p_obj_param.descr || '@' || p_obj_param.a_id); end; /
You seem to be missing a table that could hold the object. See the next topic, especially the line # 43:
Connected to: Oracle Database 11g Release 11.2.0.3.0 - 64bit Production SQL> create or replace type typ_obj_test as object 2 ( 3 a_date date, 4 a_type varchar2(10), 5 a_status varchar2(2), 6 descr varchar2(10), 7 a_id number(10), 8 constructor function typ_obj_test(a_date date 9 ,a_type varchar2 default null 10 ,a_status varchar2 default null 11 ,descr varchar2 default null 12 ,a_id number default null) return self as result 13 ); 14 / Type created. SQL> create or replace type body typ_obj_test is 2 constructor function typ_obj_test(a_date date 3 ,a_type varchar2 default null 4 ,a_status varchar2 default null 5 ,descr varchar2 default null 6 ,a_id number default null) return self as result is 7 v_test varchar2(1); 8 v_id number(10); 9 begin 10 self.a_date := a_date; 11 self.a_type := a_type; 12 self.a_status := a_status; 13 self.descr := descr; 14 self.a_id := a_id; 15 return; 16 end; 17 end; 18 / Type body created. -- Create a Nested table type array of above object type SQL> create or replace type nt_typ_obj_test as table of typ_obj_test; 2 / Type created. -- Keep in out parameter's type as the nested table type -- modified the proc to do loop so that multiple records can be passed via object type SQL> create or replace procedure p_obj_test(p_obj_param in out nt_typ_obj_test) is 2 begin 3 for i in p_obj_param.first..p_obj_param.last 4 loop 5 dbms_output.put_line('Checking the object type' || p_obj_param(i).a_date || '@' || p_obj_param(i).a_type || '@' || p_obj_param(i).a_status || '@' || 6 p_obj_param(i).descr || '@' || p_obj_param(i).a_id); 7 end loop; 8 end; 9 / Procedure created. --Call the procedure SQL> set serveroutput on SQL> declare 2 i_nt_typ nt_typ_obj_test ; 3 begin 4 i_nt_typ:=nt_typ_obj_test(typ_obj_test(sysdate,'A','Y','Descr',23),typ_obj_test(sysdate,'X','Z','ewe',55)); 5 p_obj_test(i_nt_typ); 6 end; 7 / Checking the object type26-MAR-15@A@Y@Descr@23 Checking the object type26-MAR-15@X@Z@ewe@55 PL/SQL procedure successfully completed. SQL>
-
What is INSIDE and OUTSIDE in parameter of the procedure?
Hello
often IN, OUT and IN OUT are used with the parameter in the procedures and functions.
This means pass by value, by reference, we did in programming c / c++?When you create a procedure or function, you can set parameters. There are three types of parameters that may be declared:
1. - the parameter can be referenced by the procedure or function. The value of the parameter can not be overwritten by the procedure or function.
2 - the parameter may not be referenced by the procedure or function, but the value of the parameter can be replaced by the procedure or function.
3 AL '-the parameter can be referenced by the procedure or function and the value of the parameter can be replaced by the procedure or function. -
SQL that passes to the procedure as a parameter query
I'm trying to accomplish what seems so simple and yet I can't do things. I want to pass a sql query via a parameter to a procedure. In this procedure, I want to loop through the results and create options for a selection list. I tried to use EXECUTE IMMEDIATELY, sliders, SYS_REFCURSOR, etc, but nothing seems to be quite right. Any ideas on how to achieve this? Thank you!
PROCEDURE Dropdown
(
nam IN VARCHAR2,
qry IN VARCHAR2,
)
IS
html VARCHAR2(1000);
BEGIN
html := '<select id="test" name="test">';
/* ?? */
html := html || '<option value="' || val || '">' || descrip ||'</option>';
html := html || '</select>';
htp.p(html);
END Dropdown;A variation would be to use DBMS_SQL to ANALYZE and DESCRIBE the results.
In this way, you can check to make sure that you have found a SELECT statement that returns only 2 columns.
MK
-
issues related to the parameter in the procedure
Hi all
I have a procedure which the code is given below:
create or replace PROCEDURE seods01.get_cert_tx_lot_tmp (acct_alt_id_in in VARCHAR2
, acct_alt_id_cntx_cde_in IN VARCHAR2 default 'COLA account number.
, ibd_id_in IN INTEGER
qry_rslt_out to sys_refcursor)
IS
BEGIN
OPEN FOR Qry_rslt_out
SELECT L.tx_lot_seq_nbr
L.hld_prd_dte
L.orig_purc_dte
L.tx_lot_amt
L.updt_tx_lot_amt
L.tran_desc_txt
OF v_acct_alt_id A
v_cd_tx_lot L
WHERE A.acct_alt_id = acct_alt_id_in
AND A.acct_alt_id_cntx_cde = acct_alt_id_cntx_cde_in
AND A.ibd_id = ibd_id_in
AND L.eods_acct_id = A.eods_acct_id;
EXCEPTION
WHILE OTHERS THEN
dbms_output.put_line(SQLCODE||) SQLERRM);
END get_cert_tx_lot_tmp;
now when I run the SP in the following way it works fine:
VAR C1 REFCURSOR EXECUTE SEODS01.get_cert_tx_lot_tmp ('004000000000000093108026740', 'Number of COLA account', '1',: C1); PRINT C1
When I try to ignore this value by default setting, then it is throwing ' wrong number or types of arguments "error
VAR C1 REFCURSOR EXECUTE SEODS01.get_cert_tx_lot_tmp ('004000000000000093108026740 ', ' 1',: C1); PRINT C1
and when I tried to put this as null or "then it gives me no results. only way through which I can produce results of this procedure without giving the default parameter is the name of the column with the value of the parameter as follows:
VAR C1 REFCURSOR RUN SEODS01.get_cert_tx_lot_tmp (acct_alt_id_in = > '004000000000000093108026740', ibd_id_in = > '1', qry_rslt_out = >: C1); PRINT C1
but the condition is that we do not want our consumers to put names of columns when they do not pass the default value setting, I hope that there should be a way to do it. Could someone help me please on this issue.
Hello
If you want to use positional notation, then you can only omit parameters by default when they are at the end of the parameter list. In your case, this would mean
(acct_alt_id_in in VARCHAR2
ibd_id_in in FULL
qry_rslt_out ON sys_refcursor
acct_alt_id_cntx_cde_in IN VARCHAR2 default 'COLA account number')
Or you can put the procedure in a package and overload
PROCEDURE seods01.get_cert_tx_lot_tmp
(acct_alt_id_in in VARCHAR2
acct_alt_id_cntx_cde_in IN VARCHAR2
ibd_id_in in FULL
qry_rslt_out to sys_refcursor)
PROCEDURE seods01.get_cert_tx_lot_tmp
(acct_alt_id_in in VARCHAR2
ibd_id_in in FULL
qry_rslt_out to sys_refcursor)
In the procedure without the acct_alt_id_cntx_cde_in parameter, you can call the other version and provide the default value.
Concerning
Marcus
-
How to get the name and number of the procedure parameter list or a function?
I stated the procedure described in the package
If I want to get the number and the name of the parameter list, so how do I it
I don't have I her name with the package.
create or replace package demoApp is
PROCEDURE insert_data (p_fname IN VARCHAR2,
p_lname IN VARCHAR2,
p_address IN VARCHAR2,
p_cellno IN VARCHAR2,
p_email IN varchar2);
end demoApp;
create or replace package demoApp body is
PROCEDURE insert_data (p_fname IN VARCHAR2,
p_lname IN VARCHAR2,
p_address IN VARCHAR2,
p_cellno IN VARCHAR2,
p_email IN varchar2) IS
EmpID number;
BEGIN
Select nvl (max (emp1.empid), 0) + 1 in EMP1 empid;
INSERT INTO VALUES EMP1 (empid, p_fname, p_lname, p_address, p_cellno, p_email);
EXCEPTION
WHILE OTHERS THEN
raise_application_error (-20001,' insert the problem ' |) SQLERRM);
END;
end demoApp;
-----------------
I want to get the name of the parameter and the number of use of stroredrprocedure ""demoApp.insert_data " "
Select *.
of all_arguments
where package_name = 'DEMOAPP.
and object_name = 'INSERT_DATA.
-
Pass a parameter to a procedure of inserting the order...?
Hi all
I have a requirement where I need to pass the input parameter of the procedure for the insert inside the procedure command...
My procedure continues like that...
PROCEDURE pmproc_1)
A IN VARCHAR2,
B IN VARCHAR2,
C IN VARCHAR2
)
AS
BEGIN
INSERT INTO my_table
(number , activity, fact )
SELECT the number , activity, fact
Of abcd_actv_tbl
Activity WHERE =
AND > = B
AND number = C;
COMMIT;
NULL;
END pmproc_1;
My requirement is that I need to pass the input parameter C to a column in my table which is my_table
so that it becomes...
INSERT INTO my_table (number , activity, , (HERE I NEED to GET THE VALUE of 'C' ) )
SELECT the number , activity, fact
Of abcd_actv_tbl
Activity WHERE =
AND > = B
AND number = C;
Please let me know if I'm unclear...
Thanks in advance...
DEV
Based on what you have provided, I would say that something as simple as:
INSERT INTO my_table (number activity ,c_column )
SELECT the number is, c
Of abcd_actv_tbl
Activity WHERE =
AND > = B
AND number = C;
-
The execution of a function in the procedure, passed as parameter string
Hello
He must create a function, pass the name of the function to a procedure, and then run this function in the procedure.
For example:
Hello from the FUNCTION to CREATE or REPLACE
RETURN NUMBER
IS
BEGIN
RETURN 23;
END;
/
CREATE OR REPLACE PROCEDURE pro_fun (v_fun VARCHAR2, v_cal OUT NUMBER)
IS
BEGIN
v_cal: = exec v_fun; <-error on this line
END;
/
Now my plsql block annonymous where I'm passing function as sting of procedure:
DECLARE
VARCHAR2 (30) v1.
NUMBER of v2;
BEGIN
v1: = "Hello";
pro_fun (v1, v2);
DBMS_OUTPUT. Put_line ('VALUE IS' | v2);
END;
/
pro_fun (v1, v2);
*
ERROR on line 6:
ORA-06550: line 6, column 1:
PLS-00905: object SCOTT.PRO_FUN is not valid
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored
How below line of procedure must be written to perform this function.
v_cal: = exec v_fun;
Try something like this:
create or replace function forum_hello return number
is
Start
Back to 123;
end forum_hello;
/
create or replace procedure forum_call_function (function_name_in in varchar2)
is
number of l_returnvalue;
Start
run immediately "begin: l: = ' |" function_name_in |'; end;' using l_returnvalue;
dbms_output.put_line (l_returnvalue);
end;
/
exec forum_call_function ('forum_hello')
Sincere greetings,
Patrick Barel
-
How to assign values to the nested table and passes as a parameter for the procedure?
How to assign values to the nested table and passes as a parameter for the procedure?
Here are the object and its type
create or replace type test_object1 as an object
(
val1 varchar2 (50).
val2 varchar2 (50).
VARCHAR2 (50) val3
);
create or replace type test_type1 is table of the test_object1;
create or replace type test_object2 as an object
(
val1 varchar2 (50).
val2 varchar2 (50).
VARCHAR2 (50) val3
);
create or replace type test_type2 is table of the test_object2;
GRANT ALL ON test_object1 to PUBLIC;
GRANT ALL ON test_type1 to PUBLIC;
GRANT ALL ON test_object2 to PUBLIC;
GRANT ALL ON test_type2 to PUBLIC;
Here is the table object type:
create the table test_object_tpe
(
sl_num NUMBER,
Description VARCHAR2 (100),
main_val1 test_type1,
main_val2 test_type2
)
NESTED TABLE main_val1 STORE AS tot1
NESTED TABLE main_val2 STORE AS earlier2;
-----------------------------------------------------------------------------------------------------------
Here is the procedure that inserts values into the nested table:
PROCEDURE INSERT_TEST_DATA (sl_num in NUMBER,
Description in VARCHAR2,
p_main_val1 IN test_type1,
p_main_val2 IN test_type2
)
IS
BEGIN
FOR rec in p_main_val1.first... p_main_val1. Last
LOOP
INSERT INTO xxdl.test_object_tpe
(
sl_num,
Description,
main_val1,
main_val2
)
VALUES
(
sl_num
description
test_type1 (test_object1)
p_main_val1 .val1 (CRE),
p_main_val1 .val2 (CRE),
p_main_val1 .val3 (rec)
)
)
test_type2 (test_object2 (p_main_val2 .val1 (CRE),
p_main_val2 .val2 (CRE),
p_main_val2 .val3 (rec)
)
)
);
END LOOP;
commit;
END INSERT_TEST_DATA;
-------------------------------------------------------------------------------------------
Here are the block anonymoys what values attributed to the object type and pass values in the procedure:
Set serveroutput on;
declare
p_sl_num NUMBER: = 1001;
p_description VARCHAR2 (50): = 'Test Val1;
inval1 test_type1: = test_type1();
inval2 test_type2: = test_type2();
Start
inval1 (1) .val1: = "testx1";
inval1 (1) .val2: = "testx2";
inval1 (1) .val3: = "testx3";
inval2 (1) .val1: = "testy1";
inval2 (1) .val2: = "testy2";
inval2 (1) .val3: = "testy3";
CSI_PKG. INSERT_TEST_DATA (sl_num = > p_sl_num,)
Description = > p_description,
p_main_val1 = > inval1,
p_main_val2 = > inval2
);
end;
/
Someone can correct me.
Thank you
LavanThanks for posting the DOF and the sample code but whenever you post provide your Oracle version 4-digit (result of SELECT * FROM V$ VERSION).
>
How to assign values to the nested table and passes as a parameter for the procedure?
>
Well you do almost everything bad that could be hurt.Here is the code that works to insert data into your table (the procedure is not even necessary).
declare p_sl_num NUMBER := 1001; p_description VARCHAR2(50) := 'Testing Val1'; inval1 test_type1 := test_type1(); inval2 test_type2 := test_type2(); begin inval1.extend(); inval1(1) := test_object1('testx1', 'testx2', 'testx3'); inval2.extend(); inval2(1) := test_object2('testy1', 'testy2', 'testy3'); INSERT INTO test_object_tpe ( sl_num, description, main_val1, main_val2 ) VALUES (p_sl_num, p_description, inval1, inval2); commit; end; /
See example 5-15 making reference to an element of nested Table Chapter 5 using PL/SQL collections and records in the PL/SQL doc
http://docs.Oracle.com/CD/B28359_01/AppDev.111/b28370/Collections.htm#CJABEBEA1. you don't even have the procedure because it is a simple INSERTION in the table you can do directly (see my above code)
inval1(1).val1 := 'testx1';
Since you have not yet created all the elements, there is no element 1 "inval1". You need EXTEND the collection to add an element
inval1.extend();
And then, there is an empty element, but "inval1" is a container for objects of type 'test_object1' not for scalars as "val1", "val2", and "val3".
If you can not doinval1(1).val1 := 'testx1';
You must create an instance of 'test_object1 '.
inval1(1) := test_object1('testx1', 'testx2', 'testx3');
And so on for the other collection
You don't need the procedure (as my code example shows), but once you fill in the variables correctly it will work.
-
procedure call with sys_refcursor as a parameter in the procedure
Hello
I tried the following procedure after sys_refcursor as parameter of a procedure,
And confused about the procedure call
How can I call the above procedure to get the dataCREATE OR REPLACE PROCEDURE test_ref (emp_cur IN sys_refcursor) IS emp_rec Z_emp%ROWTYPE; BEGIN LOOP FETCH emp_cur INTO emp_rec; EXIT WHEN emp_cur%NOTFOUND; dbms_output.put_line(emp_rec.ename ||' is a ' || emp_rec.job); END LOOP; END;
Thank youYou must declare a variable sys_refcursor and open it with the necessary query and then pass that variable as a parameter to your procedure.
Something like that.
set serveroutput on declare my_cursor sys_refcursor; begin open my_cursor for select * from employee; test_ref (my_cursor); end; /
-
How the parameter of the procedure with the default table type?
Hello!
How the parameter of the procedure with the default table type?
For example:type varchar2lType is table of varchar2(50) index by binary_integer;
Published by: bullbil on 16.01.2012 06:35create or replace procedure test1 ( s1 varchar2(50) sa2 Varchar2Type ) as begin dbms_output.put_line('yyxxyyy!'); end; /
If he should really be an associative array for some reason any (can't think why, but just for fun...) you could declare a dummy array in the packet header and specify as the default:
create or replace package wr_test as type varchar2ltype is table of varchar2(50) index by pls_integer; g_dflt_varchar2l_tab varchar2ltype; procedure testit ( p_testarray varchar2ltype default g_dflt_varchar2l_tab ); end wr_test; create or replace package body wr_test as procedure testit ( p_testarray varchar2ltype default g_dflt_varchar2l_tab ) is begin dbms_output.put_line('p_testarray contains ' || p_testarray.count || ' elements'); end testit; end wr_test;
It is a bit of a hack, because it relies on a global variable that is exposed. A more orderly approach would overload the procedure so that a version does not have the table and another argument:
create or replace package wr_test as type varchar2ltype is table of varchar2(50) index by pls_integer; procedure testit; procedure testit ( p_testarray varchar2ltype ); end wr_test; create or replace package body wr_test as procedure testit is v_default_array varchar2ltype; begin testit(v_default_array); end testit; procedure testit ( p_testarray varchar2ltype ) is begin dbms_output.put_line('p_testarray contains ' || p_testarray.count || ' elements'); end testit; end wr_test;
-
I try to execute the procedure in which one parameter is VARRAY
I try to execute the procedure in which one parameter is VARRAY, I try below the code, but it throws error no data found.
I would define as a varray
create or replace type PROP_NAME_VAARAY as VARRAY (10) OF VARCHAR2 (30)
Start
insert_update_attribute 'I', 'Book', 'Disk', PROP_NAME_VAARAY ('a', 'b');
end;
my method of appeal is right, pls suggestHere is an example
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production With the Partitioning, OLAP and Data Mining options SQL> create or replace type test_varray as varray(10) of varchar2(10) 2 / Type created. SQL> create or replace procedure print_varray 2 ( 3 pVarray test_varray 4 ) 5 as 6 begin 7 for i in 1..pVarray.count 8 loop 9 dbms_output.put_line(pVarray(i)); 10 end loop; 11 end; 12 / Procedure created. SQL> set serveroutput on SQL> SQL> exec print_varray(test_varray('a','b','c','d')) a b c d PL/SQL procedure successfully completed. SQL>
Maybe you are looking for
-
Repair of 2013 MBP and Pick Up
Hi all. I have a MBP 2013 with start-stop does not pad and keyboard so plan to send it to repair. Q1: How long does take to fix it? Q2: Can I drop at 1 store and then pick up the other?
-
Internet is slow using NETGEAR AC1200
Internet is slow, before he was fast and my ipad is faster than my computer with the netgear adapter
-
My computer seems to work very well, but on my desktop there is always a message in the lower right corner of the screen. never had a problem until about a week ago. Help, please!
-
I HAVE A HP ENVY PHOENIX WITH 2 USB3 SE BRANCH ON THE TOP. ONE OF THE RECORDS WAS PUSHED IN. I CAN'T FIND A DESCRIPTION OF HOW TO GET TO THIS PAGE FROM ANY OF THE MAINTENANCE MANUALS. ANY SUGGESTIONS?
-
Error in database expdp remote
HelloWhen you attempt to perform an export on a remote database, I get the following errors:ORA-39006: internal errorORA-39065: exception unexpected master process in SHIPPINGORA-06575: Package or function KUPM$ MCP is in an invalid stateORA-39097: D