<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.sqle.ru/index.php?action=history&amp;feed=atom&amp;title=Oracle_PL%2FSQL_Tutorial%2FFunction_Procedure_Packages%2FNOCOPY</id>
		<title>Oracle PL/SQL Tutorial/Function Procedure Packages/NOCOPY - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.sqle.ru/index.php?action=history&amp;feed=atom&amp;title=Oracle_PL%2FSQL_Tutorial%2FFunction_Procedure_Packages%2FNOCOPY"/>
		<link rel="alternate" type="text/html" href="http://www.sqle.ru/index.php?title=Oracle_PL/SQL_Tutorial/Function_Procedure_Packages/NOCOPY&amp;action=history"/>
		<updated>2026-05-24T08:05:35Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.sqle.ru/index.php?title=Oracle_PL/SQL_Tutorial/Function_Procedure_Packages/NOCOPY&amp;diff=4410&amp;oldid=prev</id>
		<title> в 13:45, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.sqle.ru/index.php?title=Oracle_PL/SQL_Tutorial/Function_Procedure_Packages/NOCOPY&amp;diff=4410&amp;oldid=prev"/>
				<updated>2010-05-26T13:45:46Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 13:45, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://www.sqle.ru/index.php?title=Oracle_PL/SQL_Tutorial/Function_Procedure_Packages/NOCOPY&amp;diff=4411&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.sqle.ru/index.php?title=Oracle_PL/SQL_Tutorial/Function_Procedure_Packages/NOCOPY&amp;diff=4411&amp;oldid=prev"/>
				<updated>2010-05-26T10:11:51Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== IN OUT NOCOPY==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE OR REPLACE PROCEDURE very_confusing (&lt;br /&gt;
  2     arg1   IN              VARCHAR2&lt;br /&gt;
  3   , arg2   IN OUT          VARCHAR2&lt;br /&gt;
  4   , arg3   IN OUT NOCOPY   VARCHAR2&lt;br /&gt;
  5  )&lt;br /&gt;
  6  IS&lt;br /&gt;
  7  BEGIN&lt;br /&gt;
  8     arg2 := &amp;quot;Second value&amp;quot;;&lt;br /&gt;
  9     DBMS_OUTPUT.put_line (&amp;quot;arg2 assigned, arg1 = &amp;quot; || arg1);&lt;br /&gt;
 10     arg3 := &amp;quot;Third value&amp;quot;;&lt;br /&gt;
 11     DBMS_OUTPUT.put_line (&amp;quot;arg3 assigned, arg1 = &amp;quot; || arg1);&lt;br /&gt;
 12  END;&lt;br /&gt;
 13  /&lt;br /&gt;
Procedure created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; DECLARE&lt;br /&gt;
  2     str   VARCHAR2 (100) := &amp;quot;First value&amp;quot;;&lt;br /&gt;
  3  BEGIN&lt;br /&gt;
  4     DBMS_OUTPUT.put_line (&amp;quot;str before = &amp;quot; || str);&lt;br /&gt;
  5     very_confusing (str, str, str);&lt;br /&gt;
  6     DBMS_OUTPUT.put_line (&amp;quot;str after = &amp;quot; || str);&lt;br /&gt;
  7  END;&lt;br /&gt;
  8  /&lt;br /&gt;
PL/SQL procedure successfully completed.&lt;br /&gt;
SQL&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== Performance improvement of NOCOPY==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; create table product(&lt;br /&gt;
  2     product_id number(4)     not null,&lt;br /&gt;
  3     product_description varchar2(20) not null&lt;br /&gt;
  4  );&lt;br /&gt;
Table created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; insert into product values (1,&amp;quot;Java&amp;quot;);&lt;br /&gt;
1 row created.&lt;br /&gt;
SQL&amp;gt; insert into product values (2,&amp;quot;Oracle&amp;quot;);&lt;br /&gt;
1 row created.&lt;br /&gt;
SQL&amp;gt; insert into product values (3,&amp;quot;C#&amp;quot;);&lt;br /&gt;
1 row created.&lt;br /&gt;
SQL&amp;gt; insert into product values (4,&amp;quot;Javascript&amp;quot;);&lt;br /&gt;
1 row created.&lt;br /&gt;
SQL&amp;gt; insert into product values (5,&amp;quot;Python&amp;quot;);&lt;br /&gt;
1 row created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE OR REPLACE PACKAGE myPackage&lt;br /&gt;
  2  is&lt;br /&gt;
  3    type arr is varray(100000)of product%ROWTYPE;&lt;br /&gt;
  4    procedure p1(ip1 IN OUT arr);&lt;br /&gt;
  5    procedure p2(ip1 IN OUT NOCOPY arr);&lt;br /&gt;
  6    FUNCTION get_time RETURN NUMBER;&lt;br /&gt;
  7  END myPackage;&lt;br /&gt;
  8  /&lt;br /&gt;
Package created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; show errors&lt;br /&gt;
No errors.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE OR REPLACE PACKAGE BODY myPackage&lt;br /&gt;
  2  is&lt;br /&gt;
  3    PROCEDURE p1(ip1 IN OUT arr)&lt;br /&gt;
  4    IS&lt;br /&gt;
  5    BEGIN&lt;br /&gt;
  6      NULL;&lt;br /&gt;
  7    END;&lt;br /&gt;
  8    PROCEDURE p2(ip1 IN OUT NOCOPY arr)&lt;br /&gt;
  9    IS&lt;br /&gt;
 10    BEGIN&lt;br /&gt;
 11      NULL;&lt;br /&gt;
 12    END;&lt;br /&gt;
 13    FUNCTION get_time RETURN NUMBER&lt;br /&gt;
 14    IS&lt;br /&gt;
 15    BEGIN&lt;br /&gt;
 16      RETURN (dbms_utility.get_time);&lt;br /&gt;
 17    EXCEPTION WHEN OTHERS THEN&lt;br /&gt;
 18      RAISE_APPLICATION_ERROR(-20010,SQLERRM);&lt;br /&gt;
 19    END get_time;&lt;br /&gt;
 20  END myPackage;&lt;br /&gt;
 21  /&lt;br /&gt;
Package body created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; show errors&lt;br /&gt;
No errors.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; declare&lt;br /&gt;
  2    arr1 myPackage.arr :=myPackage.arr(null);&lt;br /&gt;
  3    cur_t1 number;&lt;br /&gt;
  4    cur_t2 number;&lt;br /&gt;
  5    cur_t3 number;&lt;br /&gt;
  6  begin&lt;br /&gt;
  7    select * into arr1(1)from product where product_id =1;&lt;br /&gt;
  8&lt;br /&gt;
  9&lt;br /&gt;
 10    arr1.extend(99999,1);&lt;br /&gt;
 11    cur_t1 :=myPackage.get_time;&lt;br /&gt;
 12    myPackage.p1(arr1);&lt;br /&gt;
 13    cur_t2 :=myPackage.get_time;&lt;br /&gt;
 14    myPackage.p2(arr1);&lt;br /&gt;
 15    cur_t3 :=myPackage.get_time;&lt;br /&gt;
 16&lt;br /&gt;
 17    dbms_output.put_line(&amp;quot;Without NOCOPY &amp;quot;||to_char((cur_t2-cur_t1)/100));&lt;br /&gt;
 18    dbms_output.put_line(&amp;quot;With NOCOPY &amp;quot;||to_char((cur_t3-cur_t2)/100));&lt;br /&gt;
 19  end;&lt;br /&gt;
 20  /&lt;br /&gt;
Without NOCOPY .17&lt;br /&gt;
With NOCOPY 0&lt;br /&gt;
PL/SQL procedure successfully completed.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; drop table product;&lt;br /&gt;
Table dropped.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== The behavior of NOCOPY.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE OR REPLACE PROCEDURE NoCopyTest(p_In IN NUMBER,p_Out OUT NOCOPY VARCHAR2,p_InOut IN OUT NOCOPY CHAR) IS&lt;br /&gt;
  2   BEGIN&lt;br /&gt;
  3     NULL;&lt;br /&gt;
  4   END NoCopyTest;&lt;br /&gt;
  5   /&lt;br /&gt;
Procedure created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; show errors&lt;br /&gt;
No errors.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; -- A modified version of RaiseError, with the out parameter specified as NOCOPY.&lt;br /&gt;
SQL&amp;gt; CREATE OR REPLACE PROCEDURE RaiseErrorNoCopy(p_Raise IN BOOLEAN,pA OUT NOCOPY NUMBER) AS&lt;br /&gt;
  2   BEGIN&lt;br /&gt;
  3     pA := 5;&lt;br /&gt;
  4     IF p_Raise THEN&lt;br /&gt;
  5       RAISE DUP_VAL_ON_INDEX;&lt;br /&gt;
  6     ELSE&lt;br /&gt;
  7       RETURN;&lt;br /&gt;
  8     END IF;&lt;br /&gt;
  9   END RaiseErrorNoCopy;&lt;br /&gt;
 10   /&lt;br /&gt;
Procedure created.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; show errors&lt;br /&gt;
No errors.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; -- When we call RaiseErrorNoCopy the exception semantics are changed due to NOCOPY.&lt;br /&gt;
SQL&amp;gt; DECLARE&lt;br /&gt;
  2     v_Num NUMBER := 1;&lt;br /&gt;
  3   BEGIN&lt;br /&gt;
  4     DBMS_OUTPUT.PUT_LINE(&amp;quot;Value before first call: &amp;quot; || v_Num);&lt;br /&gt;
  5     RaiseErrorNoCopy(FALSE, v_Num);&lt;br /&gt;
  6     DBMS_OUTPUT.PUT_LINE(&amp;quot;Value after successful call: &amp;quot; || v_Num);&lt;br /&gt;
  7     DBMS_OUTPUT.PUT_LINE(&amp;quot;&amp;quot;);&lt;br /&gt;
  8&lt;br /&gt;
  9     v_Num := 2;&lt;br /&gt;
 10     DBMS_OUTPUT.PUT_LINE(&amp;quot;Value before second call: &amp;quot; || v_Num);&lt;br /&gt;
 11     RaiseErrorNoCopy(TRUE, v_Num);&lt;br /&gt;
 12   EXCEPTION&lt;br /&gt;
 13     WHEN OTHERS THEN&lt;br /&gt;
 14        DBMS_OUTPUT.PUT_LINE(&amp;quot;Value after unsuccessful call: &amp;quot; || v_Num);&lt;br /&gt;
 15   END;&lt;br /&gt;
 16   /&lt;br /&gt;
Value before first call: 1&lt;br /&gt;
Value after successful call: 5&lt;br /&gt;
Value before second call: 2&lt;br /&gt;
Value after unsuccessful call: 5&lt;br /&gt;
PL/SQL procedure successfully completed.&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== The hint NOCOPY is applicable only to OUT and IN OUT types of variables==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; create or replace procedure p_validate(io_string IN OUT NOCOPY VARCHAR2)&lt;br /&gt;
  2  is&lt;br /&gt;
  3      v_invalid VARCHAR2(8):=&amp;quot;!@#$%^&amp;amp;&amp;quot;;&lt;br /&gt;
  4  begin&lt;br /&gt;
  5      io_string:=replace (io_string,v_invalid);&lt;br /&gt;
  6      if length(io_string)&amp;gt;4000&lt;br /&gt;
  7      then&lt;br /&gt;
  8          io_string:=substr(io_string,1,3997)||&amp;quot;...&amp;quot;;&lt;br /&gt;
  9      end if;&lt;br /&gt;
 10  end;&lt;br /&gt;
 11  /&lt;br /&gt;
Procedure created.&lt;br /&gt;
SQL&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
== You can pass variables by reference, even in PL/SQL==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SQL&amp;gt;&lt;br /&gt;
SQL&amp;gt; create or replace procedure p_validate(io_string IN OUT NOCOPY VARCHAR2)&lt;br /&gt;
  2  is&lt;br /&gt;
  3      v_invalid VARCHAR2(8):=&amp;quot;!@#$%^&amp;amp;&amp;quot;;&lt;br /&gt;
  4  begin&lt;br /&gt;
  5      io_string:=replace (io_string,v_invalid);&lt;br /&gt;
  6      if length(io_string)&amp;gt;4000&lt;br /&gt;
  7      then&lt;br /&gt;
  8          io_string:=substr(io_string,1,3997)||&amp;quot;...&amp;quot;;&lt;br /&gt;
  9      end if;&lt;br /&gt;
 10  end;&lt;br /&gt;
 11  /&lt;br /&gt;
Procedure created.&lt;br /&gt;
SQL&amp;gt;&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>