PL/SQL FAQ – часто задаваемые вопросы по PL/SQL


Вопрос: Как объявить курсор и как работать с ним?
Решение:
CREATE OR REPLACE 
PROCEDURE "my_cur_example" AS
    cursor cur is select myCol1, myCol2 from myTable;
BEGIN
    FOR rec IN cur LOOP
        EXIT WHEN cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(rec.myCol1);
    END LOOP;
END;

Вопрос: Как увеличить размер буфера для DBMS_OUTPUT и избавиться от ошибки ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes?
Решение:
DBMS_OUTPUT.ENABLE(1000000);

Вопрос: Как вырезать подстроку?
Решение:
select substr('Devtype', 1, 3) from dual; -- would return 'Dev'

Вопрос: Как объявить числовую переменную и присвоить ей значение?
Решение:
CREATE OR REPLACE 
PROCEDURE "example_proc" AS
    nCount NUMBER; 
BEGIN
    nCount := 0;
END;

Вопрос: Как организовать лог в PL/SQL процедурах?
Решение:
1) Создать таблицу в которой будет храниться лог:
CREATE TABLE "LOG_DATA" (
    "LOG_ID" NUMBER(19) NOT NULL ,
    "LOG_DATE" TIMESTAMP(6)  NOT NULL ,
    "LOG_STATUS" VARCHAR2(512 BYTE) NULL,
    "LOG_TAG" VARCHAR2(24 BYTE) NULL 
) LOGGING NOCOMPRESS NOCACHE;
ALTER TABLE "LOG_DATA" ADD CHECK ("LOG_ID" IS NOT NULL);
ALTER TABLE "LOG_DATA" ADD CHECK ("LOG_DATE" IS NOT NULL);
ALTER TABLE "LOG_DATA" ADD PRIMARY KEY ("LOG_ID");
2) Создать процедуру для записи в таблицу лога:
CREATE OR REPLACE 
PROCEDURE "log_write"(log_id NUMBER, status VARCHAR2, tag VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO LOG_DATA VALUES(log_id, SYSDATE, status, tag);
    COMMIT;
END;
3) Вызывать процедуру log_write из собственных процедур.

...