понедельник, 24 февраля 2014 г.

Ограничения dblink oracle

Нельзя получить переменную типа курсор вызвав процедуру через линк (statement handle not executed).
Не работают LOB, XMLTYPE
Нельзя определить тип через один линк и использовать в процедуре через другой, даже если по факту они идентичны.

четверг, 20 февраля 2014 г.

Пример файла настройки для pl/sql developer beautifier

Создать файл имя.br с содержимым:
______________________________________________________________________________
Version=1
RightMargin=76
Indent=2
UseTabCharacter=FALSE
TabCharacterSize=2
AlignDeclarationGroups=TRUE
AlignAssignmentGroups=TRUE
KeywordCase=1
IdentifierCase=0
UseSpecialCase=TRUE
ItemList.Format=1
ItemList.Align=TRUE
ItemList.CommaAfter=TRUE
ItemList.AtLeftMargin=FALSE
EmptyLines=1
ThenOnNewLine=FALSE
LoopOnNewLine=FALSE
DML.LeftAlignKeywords=FALSE
DML.LeftAlignItems=FALSE
DML.OnOneLineIfPossible=TRUE
DML.WhereSplitAndOr=TRUE
DML.WhereAndOrAfterExpression=FALSE
DML.WhereAndOrUnderWhere=TRUE
DML.JoinSplitBeforeOn=TRUE
DML.InsertItemList.Format=1
DML.InsertItemList.Align=FALSE
DML.InsertItemList.CommaAfter=TRUE
DML.InsertItemList.AtLeftMargin=FALSE
DML.SelectItemList.Format=1
DML.SelectItemList.Align=TRUE
DML.SelectItemList.CommaAfter=TRUE
DML.SelectItemList.AtLeftMargin=FALSE
DML.UpdateItemList.Format=1
DML.UpdateItemList.Align=TRUE
DML.UpdateItemList.CommaAfter=TRUE
DML.UpdateItemList.AtLeftMargin=FALSE
ParameterDeclarationList.Format=1
ParameterDeclarationList.Align=TRUE
ParameterDeclarationList.CommaAfter=TRUE
ParameterDeclarationList.AtLeftMargin=FALSE
RecordFieldList.Format=1
RecordFieldList.Align=TRUE
RecordFieldList.CommaAfter=TRUE
RecordFieldList.AtLeftMargin=FALSE
SplitAndOr=FALSE
AndOrAfterExpression=FALSE
[SpecialCase]

понедельник, 3 февраля 2014 г.

Выборка из таблицы с типом, опеределеным в пакете, ошибка local collection types not allowed in SQL statements

Для примера определим пакет:

create or replace package sample_pkg is
  type myRec is record(
    id   number,
    name varchar2(50));
  type myRecTbl is table of myRec;
  type crs is ref cursor;
  procedure test;
end sample_pkg;

Если в коде захочется сделать например так

 function test_crs return crs is
    myTab  myRecTbl := myRecTbl();
    p_id   number;
    p_name varchar2(50);
    i      number := 1;
    res    crs;
 
  begin
 
    for cr in (select * from sample_table) loop
      myTab.extend();
      myTab(i).id := cr.id;
      myTab(i).name := cr.name;
      i := i + 1;
    end loop;
 
    for x in (select * from table(myTab)) loop
      dbms_output.put_line(x.name);
    end loop;
 
    return crs;
 
  end test_crs;

будет ошибка Error: PLS-00642: local collection types not allowed in SQL statements, так как для использования в SQL тип доложен быть определен на уровне БД (схемы) а не в пакете.