<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Neuronworks Blog, WebMethods, Oracle, Bea, Java Dev2Dev,   Arch2Arch   Neuronworks Make IT Easy, Let&#039;s Play the Game &#187; ref cursor</title>
	<atom:link href="http://blog.neuronworks.net/tag/ref-cursor/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.neuronworks.net</link>
	<description></description>
	<lastBuildDate>Tue, 01 Jun 2010 02:40:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Oracle Cursor dan Ref Cursor</title>
		<link>http://blog.neuronworks.net/2009/01/06/oracle-cursor-danref-cursor/</link>
		<comments>http://blog.neuronworks.net/2009/01/06/oracle-cursor-danref-cursor/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 07:07:34 +0000</pubDate>
		<dc:creator>onlypie86</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[ref cursor]]></category>

		<guid isPermaLink="false">http://blog.neuronworks.net/?p=94</guid>
		<description><![CDATA[Definisi Cursor
Dalam blok PL/SQL tidak mengijinkan kita membuat query yang menghasilkan lebih dari satu baris untuk ditampung dalam sebuah variabel. Variabel semacam ini dinamakan cursor.
Kegunaan

Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris
Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record

Macam2 Cursor
Cursor : cursor eksplisit dan cursor implisit

Cursor Eksplisit : Cursor yang [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Definisi Cursor</strong><br />
Dalam blok PL/SQL tidak mengijinkan kita membuat query yang menghasilkan lebih dari satu baris untuk ditampung dalam sebuah variabel. Variabel semacam ini dinamakan <em>cursor</em>.<br />
<strong>Kegunaan</strong></p>
<ol>
<li>Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris</li>
<li>Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record</li>
</ol>
<p><strong>Macam2 Cursor</strong><br />
Cursor : <em>cursor eksplisit</em> dan <em>cursor implisit</em></p>
<ul>
<li><strong>Cursor Eksplisit : </strong>Cursor yang harus dideklarasikan terlebih dahulu sebelum digunakan</li>
<p>Contoh :</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"> DECLARE
    CURSOR c_nama <span style="color: #993333; font-weight: bold;">IS</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> nama_petugas <span style="color: #993333; font-weight: bold;">FROM</span> pegawai <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> nama_petugas <span style="color: #993333; font-weight: bold;">ASC</span>;
    v_nama PETUGAS<span style="color: #66cc66;">.</span>nama_petugas%TYPE; <span style="color: #808080; font-style: italic;">/**%TYPE agar tipe data variabel v_nama sama dengan kolom nama_petugas?*/</span>
BEGIN
    <span style="color: #993333; font-weight: bold;">FOR</span> X <span style="color: #993333; font-weight: bold;">IN</span> c_nama
    LOOP
      DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT_LINE <span style="color: #66cc66;">&#40;</span>c_nama%ROWCOUNT ||<span style="color: #ff0000;">'Daftar Nama Petugas : '</span> || x<span style="color: #66cc66;">.</span>nama_petugas<span style="color: #66cc66;">&#41;</span>;
    END LOOP;
END;</pre></div></div>

<li><strong>Cursor Implisit : </strong>Cursor yang tidak perlu dideklarasikan dulu pada declare section. contoh cursor implisit diasosiasikan dengan perintah SELECT, INSERT, DELETE, dan UPDATE<br />
Contoh :</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;">DECLARE
  id VARCHAR2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;
  vnama_petugas PETUGAS<span style="color: #66cc66;">.</span>nama_petugas%TYPE;
BEGIN
  id :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'PG-010'</span>; <span style="color: #66cc66;">//</span>assigment value
  <span style="color: #993333; font-weight: bold;">SELECT</span> nama_petugas <span style="color: #993333; font-weight: bold;">INTO</span> vnama_petugas <span style="color: #993333; font-weight: bold;">FROM</span> PETUGAS <span style="color: #993333; font-weight: bold;">WHERE</span> id_petugas <span style="color: #66cc66;">=</span> id;
  <span style="color: #993333; font-weight: bold;">IF</span> SQL%NOTFOUND THEN
     DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT_LINE<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Data ditemukan'</span><span style="color: #66cc66;">&#41;</span>;
  ELSE
     DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT_LINE <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Nama petugas dengan id : '</span> || id || <span style="color: #ff0000;">'adalah '</span> || vnama_petugas<span style="color: #66cc66;">&#41;</span>;
  END <span style="color: #993333; font-weight: bold;">IF</span>;
END;</pre></div></div>

</li>
</ul>
<p><strong>Ref Cursor</strong><br />
Kita dapat menggunakan ref cursor untuk mengembalikan nilai dalam bentuk recordset/cursor di store procedure.<br />
Ada 2 tipe ref cursor :</p>
<ol>
<li><strong>Strong ref cursor</strong> : tipe data dan panjangnya harus diketahui saat compile</li>
<li><strong>Weak ref cursor</strong> : tipe data dan panjangnya tidak dibutuhkan saat compile</li>
</ol>
<p>Contoh :</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"> declare
  type r_cursor <span style="color: #993333; font-weight: bold;">IS</span> REF CURSOR;
  c_emp r_cursor;
  en emp%rowtype;
begin
  open c_emp <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> emp;
  loop
      fetch c_emp <span style="color: #993333; font-weight: bold;">INTO</span> en;
      exit when c_emp%notfound;
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>c_emp%rowcount ||<span style="color: #ff0000;">'. '</span>||en<span style="color: #66cc66;">.</span>nama<span style="color: #66cc66;">&#41;</span>;
  end loop;
  close c_emp;
end;
 declare
  type r_cursor <span style="color: #993333; font-weight: bold;">IS</span> REF CURSOR;
  c_emp r_cursor;
  en emp%rowtype;
begin
  open c_emp <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> emp;
  loop
      fetch c_emp <span style="color: #993333; font-weight: bold;">INTO</span> en;
      exit when c_emp%notfound;
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>c_emp%rowcount ||<span style="color: #ff0000;">'. '</span>||en<span style="color: #66cc66;">.</span>nama<span style="color: #66cc66;">&#41;</span>;
  end loop;
  close c_emp;
end;</pre></div></div>

<p><strong>Menggunakan ref cursor di dalam loop</strong><br />
Contoh :</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;">declare
  type r_cursor <span style="color: #993333; font-weight: bold;">IS</span> REF CURSOR;
  c_emp r_cursor;
  type rec_emp <span style="color: #993333; font-weight: bold;">IS</span> record
  <span style="color: #66cc66;">&#40;</span>
    deptno  varchar2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
    nama   number<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>;
  er rec_emp;
begin
  <span style="color: #993333; font-weight: bold;">FOR</span> i <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> deptno<span style="color: #66cc66;">,</span>lokasi <span style="color: #993333; font-weight: bold;">FROM</span> location<span style="color: #66cc66;">&#41;</span>
  loop
    open c_emp <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> emp <span style="color: #993333; font-weight: bold;">WHERE</span> deptno <span style="color: #66cc66;">=</span> i<span style="color: #66cc66;">.</span>deptno;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">.</span>lokasi<span style="color: #66cc66;">&#41;</span>;
    dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'--------------'</span><span style="color: #66cc66;">&#41;</span>;
    loop
      fetch c_emp <span style="color: #993333; font-weight: bold;">INTO</span> er;
      exit when c_emp%notfound;
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>er<span style="color: #66cc66;">.</span>name || <span style="color: #ff0000;">' - '</span> || er<span style="color: #66cc66;">.</span>sal<span style="color: #66cc66;">&#41;</span>;
    end loop;
    close c_emp;
  end loop;
end;</pre></div></div>

<p>pada variabel &#8216;i&#8217; tersedia informasi pada tabel location (deptno, lokasi).<br />
<strong>Persamaan dan perbedaan antara cursor dan ref cursor :</strong><br />
Persamaan :</p>
<ol>
<li>Untuk menerima hasil query yang jumlah barisnya lebih dari 1 baris</li>
<li>Memungkinkan untuk melakukan proses yang lebih kompleks untuk setiap record</li>
</ol>
<p>Perbedaan :</p>
<ol>
<li>Sebuah ref cursor dapat diasosiasikan dengan lebih dari 1 klausa SELECT saat run-time. Sebelum klausa SELECT baru, cursor sebelumnya harus ditutup dulu.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.neuronworks.net/2009/01/06/oracle-cursor-danref-cursor/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
