Conforme documentação do Oracle ,
PL/SQL é baseado na linguagem de programação Ada.PL/SQL usa uma variante de Descriptive Intermediate Attributed Notation for Ada (DIANA), uma linguagem intermediária estruturada em árvore. Ela é definida usando uma meta-notação chamada Interface Definition Language (IDL) .DIANA é usado internamente por compiladores e outras ferramentas.
Em tempo de compilação, o código-fonte PL/SQL é traduzido em código m legível por máquina. Tanto o DIANA quanto o código m de um procedimento ou pacote são armazenados no banco de dados. Em tempo de execução, eles são carregados no conjunto de memória compartilhada. O DIANA é usado para compilar procedimentos dependentes; o código-m é simplesmente executado.
Infelizmente, não é possível estimar o número de nós DIANA a partir do tamanho analisado. Duas unidades de programa com o mesmo tamanho analisado podem exigir 1.500 e 2.000 nós DIANA, respectivamente, porque, por exemplo, a segunda unidade contém instruções SQL mais complexas.
Pergunte ao tom diz
Para saber mais sobre cálculos de nós DIANA, leia este livro "Ada-Europe '93:12th Ada-Europe International Conference, "Ada Sans Frontieres", Paris, France, June 14-18, 1993. Proceedings"
A nota de suporte a seguir aborda bem esse tópico...
Article-ID: <Note:62603.1>
Folder: PLSQL
Topic: General Information Articles
Title: 'PLS-123 Program too Large' - Size Limitations on PLSQL
Packages
Document-Type: BULLETIN
Impact: MEDIUM
Skill-Level: NOVICE
Server-Version: 07 to 08
Updated-Date: 13-JUN-2000 17:41:01
References:
Visão geral
Este artigo contém informações sobre limitações de tamanho de pacote PL/SQL. Quando os limites são atingidos, você recebe o seguinte erro:
PLS-123 Program too large
Limitações de tamanho em pacotes PL/SQL
Em versões anteriores a 8.1.3, programas grandes resultavam no erro PLS-123. Isso ocorreu devido a limites genuínos no compilador; não como resultado de um bug.
Ao compilar uma unidade PL/SQL, o compilador constrói uma árvore de análise sintática. O tamanho máximo da unidade aPL/SQL é determinado pelo tamanho da árvore de análise. Existe um número máximo de nós diana nesta árvore.
Até 7.3, você poderia ter 2 * * 14 (16K) nós de Diana, e de 8.0 a 8.1.3, 2 * * 15 (32K) nós de Diana eram permitidos. Com a versão 8.1.3, esse limite foi relaxado para que agora você possa ter 2 * * 26 (ou seja, 64M) nós de diana nesta árvore para corpos de pacotes e tipos.
Limites do código-fonte
Embora não haja uma maneira fácil de traduzir os limites em termos de linhas de código-fonte, observamos que houve aproximadamente 5 a 10 nós por linha de código-fonte. Antes do 8.1.3, o compilador podia compilar de forma limpa até cerca de 3.000 linhas de código.
A partir do 8.1.3, o limite foi relaxado para corpos de pacotes e corpos de tipo que agora podem ter aproximadamente até cerca de 6.000.000 linhas de código.
Observações:Esse novo limite se aplica apenas a corpos de pacote e corpos de tipo. Além disso, agora você pode começar a atingir alguns outros limites do compilador antes de atingir esse limite específico do compilador.
Em termos de tamanho do código-fonte, suponha que os tokens (identificadores, operadores, funções etc.) tenham em média quatro caracteres. Então, o máximo seria:
Up to 7.3: 4 * (2 * * 14)=64K
From 8.0 to 8.1.3: 4 * (2 * * 15)=128K
With 8.1.3: 4 * (2 * * 25)=256M
Esta é uma estimativa aproximada. Se o seu código tiver muitos espaços, identificadores longos, etc., você pode acabar com um código-fonte maior que isso. Você também pode acabar com um código-fonte menor do que isso se suas fontes usarem identificadores muito curtos, etc.
Observe que isso é por unidade de programa, portanto, é mais provável que os corpos dos pacotes encontrem esse limite.
Como verificar o tamanho atual de um pacote
Para verificar o tamanho de um pacote, o número relacionado mais próximo que você pode usar é PARSED_SIZE na visualização do dicionário de dados USER_OBJECT_SIZE. Esse valor fornece o tamanho dos inbytes do DIANA conforme armazenado nas tabelas SYS.IDL_xxx$ e NÃO é o tamanho do pool compartilhado.
O tamanho da parte DIANA do código PL/SQL (usado durante a compilação) é MUITO maior no pool compartilhado do que na tabela do sistema.
Por exemplo, você pode começar a ter problemas com um limite de 64 K quando o PARSED_SIZE em USER_OBJECT_SIZE não for maior que 50 K.
Para um pacote, o tamanho analisado ou o tamanho do DIANA faz sentido apenas para o objeto inteiro, não separadamente para a especificação e o corpo.
Se você selecionar tamanho_parsed para um pacote, receberá tamanhos de código e fonte separados para a especificação e o corpo, mas apenas um tamanho analisado significativo para todo o objeto que é gerado na linha para a especificação do pacote. Um 0 é gerado para o parsed_size na linha do corpo do pacote.
O exemplo a seguir demonstra esse comportamento:
CREATE OR REPLACE PACKAGE example AS
PROCEDURE dummy1;
END example;
/
CREATE OR REPLACE PACKAGE BODY example AS
PROCEDURE dummy1 IS
BEGIN
NULL;
END;
END;
/
SQL> start t1.sql;
Package created.
Package body created.
SQL> select parsed_size from user_object_size where name='EXAMPLE';
PARSED_SIZE
-----------
185
0
SQL> select * from user_object_size where name='EXAMPLE';
.....
O Oracle armazena DIANA e MCODE no banco de dados. MCODE é o código real que é executado, enquanto DIANA para uma determinada unidade de biblioteca X contém informações necessárias para compilar procedimentos usando a unidade de biblioteca X.
Seguem várias notas:
a) DIANA está representada no IDL. A versão linear do IDL é armazenada em disco. A árvore de análise real é construída e armazenada no pool compartilhado. É por isso que o tamanho de DIANA no pool compartilhado geralmente é maior do que no disco.
b) DIANA para procedimentos chamados é necessário no pool compartilhado somente quando você cria procedimentos. Em sistemas de produção, não há necessidade de DIANA no pool compartilhado (mas apenas para o MCODE).
c) A partir da versão 7.2, o DIANA para corpos de pacotes é descartado, não é usado e não é armazenado no banco de dados. É por isso que o PARSED_SIZE (ou seja, o tamanho de DIANA) de PACKAGE BODIES é 0.
Um pacote é armazenado em DIANA no banco de dados, assim como um procedimento. No entanto, um pacote pode ser usado para quebrar a cadeia de dependências, talvez fazendo com que isso desapareça. É minha convicção que o código ALLproduction (real) deve estar em um pacote, nunca em um procedimento ou função independente.