Oracle PL-SQL Cursor,Object ve Diziler

Erhan Kocabaş tarafından yayınlanmıştır 13. Kasım 2009 02:17

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;

/

 

 

 

 

 

3 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , , , ,

Makale | Oracle PL-SQL

Oracle PL-SQL Fonksyon , paket,prosedürler ve hata yakalama

Erhan Kocabaş tarafından yayınlanmıştır 13. Kasım 2009 01:25

Merhaba, Oracle PL-SQL Kodlarını baştan sona inceleyeceğim ve pl-sql dilinin yazım kurallarını anlatacağım referans niteliğinde bir yazı dizisi oluşturmaya karar verdim. Bu bölümde fonksyon,paket, cursor kavramını ve hata yakalama kodlarını vereceğim.

Genel Tanımlar blok yapısı:

Prosedür Tanımlama Syntax yapısı: 

CREATE [OR REPLACE] PROCEDURE procedure_name

 [(parameter1 [mode] datatype1,

   parameter2 [mode] datatype2, ...)]

IS|AS

  [local_variable_declarations; …]

BEGIN
  -- actions;

END [procedure_name];

 

Fonksyonların Syntax yapısı;

CREATE [OR REPLACE] FUNCTION function_name
 
[(parameter1 [mode1] datatype1, ...)]

RETURN datatype IS|AS

 [local_variable_declarations; …]

BEGIN
  -- actions;

  RETURN expression;

END [function_name];

 

Örnek bir Fonksyon;

 

CREATE OR REPLACE FUNCTION get_credit

 (v_id customers.customer_id%TYPE) RETURN NUMBER IS

  v_credit customers.credit_limit%TYPE := 0;

BEGIN

  SELECT credit_limit

  INTO   v_credit

  FROM   customers        

  WHERE  customer_id = v_id;

  RETURN v_credit;

END get_credit;

/

 

 

Bu örnek fonksyonu çalıştırmak için ;

 

EXECUTE dbms_output.put_line(get_credit(101))

Package Oluşturmak;

Ilk once Package’n spec kısmı;

CREATE [OR REPLACE] PACKAGE package_name IS|AS

    public type and variable declarations

    subprogram specifications

END [package_name];

 

Body kısmı;

 

CREATE [OR REPLACE] PACKAGE BODY package_name IS|AS

    private type and variable declarations

    subprogram bodies

[BEGIN initialization statements]

END [package_name];

Oracle Cursor’lar

Oracle Cursorların 4 temel özniteliği vardır.

      cursor_name%FOUND

      cursor_name%ISOPEN

      cursor_name%NOTFOUND

      cursor_name%ROWCOUNT

Cursor Kullanımı için Syntax yapısı;

FOR record_name IN cursor_name LOOP  

  statement1;

  statement2;

  . . .

END LOOP;

Örnek Cursor Kullanımı;

SET SERVEROUTPUT ON

DECLARE

  CURSOR cur_cust IS

   SELECT cust_first_name, credit_limit

   FROM customers

   WHERE credit_limit > 4000;

BEGIN

  

    LOOP

     DBMS_OUTPUT.PUT_LINE

     (                              ||' '||

                                  );  

    END LOOP;

END;

/

 

Hata Yakalama;

 

DECLARE

  v_lname VARCHAR2(15);

BEGIN

  SELECT cust_last_name INTO v_lname FROM customers

  WHERE cust_first_name='Ally';

  DBMS_OUTPUT.PUT_LINE ('Ally''s last name is : '
                 ||v_lname);

EXCEPTION

  WHEN TOO_MANY_ROWS THEN

  DBMS_OUTPUT.PUT_LINE (' Your select statement
  retrieved multiple rows. Consider using a
  cursor.');

 

END;

/

Oracle Hata Tipleri;

     NO_DATA_FOUND

     TOO_MANY_ROWS

     INVALID_CURSOR

     ZERO_DIVIDE

     DUP_VAL_ON_INDEX

Hata Fırlatma ;

raise_application_error (error_number,

       message[, {TRUE | FALSE}]);

 

3 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , , , , ,

Makale | Oracle PL-SQL



Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.


Erhan Kocabaş Hakkında

Erhan Kocabaş 1985 yılında Kocaeli/Çınarlıda Doğdu.
Sakarya Üniversitesi Bilgisayar Mühendisliği bölümünden 2009 da mezun oldu.
Şuan Özel bir firmada Yazılım Mühendisliği yapmakta.
Erhan Kocabaş - MCPD MCTS

Son Yazılar

Son Yorumlar

Comment RSS