<?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 &#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>Sun, 04 Dec 2011 05:10:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<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]]></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" style="font-family:monospace;"> <span style="color: #993333; font-weight: bold;">DECLARE</span>
    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%<span style="color: #993333; font-weight: bold;">TYPE</span>; <span style="color: #808080; font-style: italic;">/**%TYPE agar tipe data variabel v_nama sama dengan kolom nama_petugas?*/</span>
<span style="color: #993333; font-weight: bold;">BEGIN</span>
    <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: #66cc66;">||</span><span style="color: #ff0000;">'Daftar Nama Petugas : '</span> <span style="color: #66cc66;">||</span> x<span style="color: #66cc66;">.</span>nama_petugas<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #993333; font-weight: bold;">END</span> LOOP;
<span style="color: #993333; font-weight: bold;">END</span>;</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" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DECLARE</span>
  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%<span style="color: #993333; font-weight: bold;">TYPE</span>;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
  id :<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'PG-010'</span>; <span style="color: #66cc66;">//</span>assigment <span style="color: #993333; font-weight: bold;">VALUE</span>
  <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 <span style="color: #993333; font-weight: bold;">THEN</span>
     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>;
  <span style="color: #993333; font-weight: bold;">ELSE</span>
     DBMS_OUTPUT<span style="color: #66cc66;">.</span>PUT_LINE <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Nama petugas dengan id : '</span> <span style="color: #66cc66;">||</span> id <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'adalah '</span> <span style="color: #66cc66;">||</span> vnama_petugas<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">IF</span>;
<span style="color: #993333; font-weight: bold;">END</span>;</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" style="font-family:monospace;"> <span style="color: #993333; font-weight: bold;">DECLARE</span>
  <span style="color: #993333; font-weight: bold;">TYPE</span> r_cursor <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">REF</span> CURSOR;
  c_emp r_cursor;
  en emp%rowtype;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
  <span style="color: #993333; font-weight: bold;">OPEN</span> 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 <span style="color: #993333; font-weight: bold;">WHEN</span> c_emp%notfound;
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>c_emp%rowcount <span style="color: #66cc66;">||</span><span style="color: #ff0000;">'. '</span><span style="color: #66cc66;">||</span>en<span style="color: #66cc66;">.</span>nama<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">END</span> loop;
  close c_emp;
<span style="color: #993333; font-weight: bold;">END</span>;
 <span style="color: #993333; font-weight: bold;">DECLARE</span>
  <span style="color: #993333; font-weight: bold;">TYPE</span> r_cursor <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">REF</span> CURSOR;
  c_emp r_cursor;
  en emp%rowtype;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
  <span style="color: #993333; font-weight: bold;">OPEN</span> 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 <span style="color: #993333; font-weight: bold;">WHEN</span> c_emp%notfound;
      dbms_output<span style="color: #66cc66;">.</span>put_line<span style="color: #66cc66;">&#40;</span>c_emp%rowcount <span style="color: #66cc66;">||</span><span style="color: #ff0000;">'. '</span><span style="color: #66cc66;">||</span>en<span style="color: #66cc66;">.</span>nama<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #993333; font-weight: bold;">END</span> loop;
  close c_emp;
<span style="color: #993333; font-weight: bold;">END</span>;</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" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DECLARE</span>
  <span style="color: #993333; font-weight: bold;">TYPE</span> r_cursor <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">REF</span> CURSOR;
  c_emp r_cursor;
  <span style="color: #993333; font-weight: bold;">TYPE</span> 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   <span style="color: #993333; font-weight: bold;">NUMBER</span><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;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
  <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
    <span style="color: #993333; font-weight: bold;">OPEN</span> 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 <span style="color: #993333; font-weight: bold;">WHEN</span> 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: #66cc66;">||</span> <span style="color: #ff0000;">' - '</span> <span style="color: #66cc66;">||</span> er<span style="color: #66cc66;">.</span>sal<span style="color: #66cc66;">&#41;</span>;
    <span style="color: #993333; font-weight: bold;">END</span> loop;
    close c_emp;
  <span style="color: #993333; font-weight: bold;">END</span> loop;
<span style="color: #993333; font-weight: bold;">END</span>;</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>3</slash:comments>
		</item>
	</channel>
</rss>

