Oracle Cursor’larda satırların içinde tek tek dolaşabilmek
için fetch komutunu kullanırız. Bu komutla Cursor’un içine attığımız tabloların
kolon adlarıyla içindeki veriye ulaşır ve satır satır işlem yapabiliriz.
Örnek Kod;
DECLARE
CURSOR cur_cust
IS
SELECT
customer_id, cust_last_name, cust_email
FROM customers
WHERE
credit_limit = 1200;
v_cust_record cur_cust%ROWTYPE;
BEGIN
OPEN cur_cust;
LOOP
FETCH cur_cust
INTO v_cust_record;
...
Parametre alan cursor tanımlamak;
CREATE OR REPLACE PROCEDURE cust_pack
(p_crd_limit_in
NUMBER, p_acct_mgr_in NUMBER)
IS
v_credit_limit
NUMBER := 1500;
CURSOR cur_cust
(p_crd_limit NUMBER, p_acct_mgr NUMBER)
IS
SELECT
customer_id, cust_last_name, cust_email
FROM customers
WHERE credit_limit = p_crd_limit
AND account_mgr_id = p_acct_mgr;
cust_record cur_cust%ROWTYPE;
BEGIN
OPEN
cur_cust(p_crd_limit_in, p_acct_mgr_in);
...
CLOSE cur_cust;
...
OPEN
cur_cust(v_credit_limit, 145);
...
END;
Oracle da Objectler;
Oracle object’ler değişken şablonları olarak kullanılır. Büyük bir projede yüzlerce değişkenin
tanımlandığını düşünürsek objectler’in oldukça kullanışlı olduğunu görebiliriz.
CREATE [OR REPLACE] TYPE type_name
AS OBJECT
( attribute1
datatype,
attribute2
datatype,
...
);
Örnek
olarak;
CREATE TYPE cust_address_typ
AS OBJECT
(
street_address VARCHAR2(40)
,
postal_code VARCHAR2(10)
, city VARCHAR2(30)
,
state_province VARCHAR2(10)
,
country_id CHAR(2)
);
/
Örnek Kullanım;
CREATE TABLE customers
(
customer_id NUMBER(6) ...
,
cust_first_name VARCHAR2(20) ...
,
cust_last_name VARCHAR2(20) ...
, cust_address cust_address_typ
...
DESCRIBE customers
Name Null? Type
---------------------------- -------- ----------
CUSTOMER_ID NOT NULL NUMBER(6)
CUST_FIRST_NAME NOT NULL VARCHAR2(20)
CUST_LAST_NAME NOT NULL VARCHAR2(20)
CUST_ADDRESS CUST_ADDRESS_TYP
...
Yada insert cümlesinde;
INSERT INTO CUSTOMERS (customer_id, cust_first_name,
cust_last_name, cust_address)
VALUES (1000, 'John', 'Smith',
cust_address_typ ( '285 Derby Street'
,
'02465'
,
'Boston'
,
'MA'
,
'US'));
Oracle’da Dizi kullanımı
Oracle da dizileri kullanırken dikkatli olmanız
gerekiyor. Dizilerin bazı türlerini .NET tarafından gönderirken sorun
yaşayabilirsiniz. Ama yinede bilindik diziler işinizi kolaylaştıracaktır.
TYPE type_name IS TABLE OF element_datatype
[NOT NULL];
TYPE type_name IS VARRAY (max_elements) OF
element_datatype [NOT NULL];
CREATE OR REPLACE PACKAGE manage_dept_proj AS
TYPE
typ_proj_details IS TABLE OF typ_Project;
...
PROCEDURE
allocate_proj
(propose_proj
IN typ_proj_details);
FUNCTION
top_project (n NUMBER)
RETURN
typ_proj_details;
...
Dizilerle ilgili metodlar;
• EXISTS
• COUNT
• LIMIT
• FIRST
and LAST
• PRIOR
and NEXT
• EXTEND
• TRIM
• DELETE
Dizi elemanlarına ulaşmak;
DECLARE
i INTEGER;
v_accounting_project typ_ProjectList;
BEGIN
v_accounting_project := typ_ProjectList(
typ_Project
(1,'Dsgn New Expense Rpt', 3250),
typ_Project (2,
'Outsource Payroll', 12350),
typ_Project (3,
'Audit Accounts Payable',1425));
i :=
v_accounting_project.FIRST ;
WHILE i IS NOT
NULL LOOP
IF
v_accounting_project(i).cost > 10000 then
DBMS_OUTPUT.PUT_LINE('Project too expensive: '
|| v_accounting_project(i).title);
END IF;
i :=
v_accounting_project.NEXT (i);
END LOOP;
END;
/