web 2.0

Oracle PL-SQL Cursor,Object ve Diziler

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;

/

 

 

 

 

 

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

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

Tags: , , , ,

Makale | Oracle PL-SQL

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

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}]);

 

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

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

Tags: , , , , ,

Makale | Oracle PL-SQL