manual de pl1 - basico
DESCRIPTION
PL/I ("Programming Language One", ) is a proceduralTRANSCRIPT
1. ESTRUTURA PADRÃO DE UM PROGRAMA PL/I……….........................................................................................3
2. SINTAXE DO COMANDO PL/I................................................................................................................................... 3
3. CARTÃO COMENTÁRIO OBRIGATÓRIO PELA INSTALAÇÃO..............................................................................3
4. IDENTIFICAÇÃO DO PROGRAMA............................................................................................................................ 4
PROGRAMA PRINCIPAL............................................................................................................................................... 4SUB-ROTINA INTERNA OU EXTERNA......................................................................................................................... 4
5. DECLARAÇÕES......................................................................................................................................................... 4
5.1. DECLARAÇÃO DE ARQUIVOS.............................................................................................................................. 45.2. DECLARAÇÃO DE CAMPOS.................................................................................................................................. 55.3. MÁSCARA DE EDIÇÃO PARA CAMPO NUMÉRICO ZONADO (PIC)....................................................................65.4. CAMPO NUMÉRICO ZONADO (PIC) COM SINAL.................................................................................................75.5. CAMPO DE TAMANHO VARIÁVEL (VARYING).....................................................................................................75.6. ESTRUTURAS......................................................................................................................................................... 75.7. DECLARAÇÃO DE ESTRUTURA VIA "LIKE".........................................................................................................75.8. REDEFINIÇÃO........................................................................................................................................................ 85.9. REDEFINIÇÃO POSICIONAL.................................................................................................................................. 85.10. IMPORTANTE / CUIDADO.................................................................................................................................... 8
6. COPY-BOOK (INCLUDE)........................................................................................................................................... 8
7. TRATAMENTO DE CONDIÇÃO DE EXCEÇÃO (ON CONDITIONS)........................................................................8
8. MANIPULAÇÃO DE ARQUIVO.................................................................................................................................. 9
8.1. ARQUIVO TIPO "RECORD".................................................................................................................................... 98.2. ARQUIVO TIPO STREAM-ORIENTED OUTPUT - SYSPRINT...............................................................................9
9. DESVIO INCONDICIONAL....................................................................................................................................... 10
10. ATRIBUIÇÃO............................................................................................................................................................ 10
11. EXPRESSÕES E OPERAÇÕES............................................................................................................................... 10
PRIORIDADE DAS EXPRESSÕES.............................................................................................................................. 11PRIORIDADES DOS OPERANDOS............................................................................................................................. 11
12. OPERAÇÕES DE COMPARAÇÃO.......................................................................................................................... 11
13. COMANDO "IF"........................................................................................................................................................ 12
14. COMANDO "SELECT"............................................................................................................................................. 12
15. COMANDO "DO"...................................................................................................................................................... 12
16. BLOCOS................................................................................................................................................................... 13
SEQUÊNCIA DE EXECUÇÃO DOS BLOCOS.............................................................................................................14MAPA DE BLOCOS/VARIÁVEIS GLOBAIS E LOCAIS................................................................................................14
17. FUNÇÕES - BUILTIN................................................................................................................................................ 15
MULTIPLY(A,B,I,J)....................................................................................................................................................... 15DIVIDE(A,B,I,J)............................................................................................................................................................. 15MOD............................................................................................................................................................................. 15VERIFY(A,B)................................................................................................................................................................. 15
- 1 -
INDEX(A,B)................................................................................................................................................................... 16SUBSTR(A,B,C)............................................................................................................................................................ 16LENGTH....................................................................................................................................................................... 16HIGH(N)........................................................................................................................................................................ 16LOW(N)......................................................................................................................................................................... 16LBOUND....................................................................................................................................................................... 16HBOUND...................................................................................................................................................................... 16PLIRETC....................................................................................................................................................................... 16DATE............................................................................................................................................................................ 16TIME............................................................................................................................................................................. 17
18. RECURSOS DE DEBUG.......................................................................................................................................... 17
SUBSCRIPTRANGE..................................................................................................................................................... 17CHECK......................................................................................................................................................................... 17
19. PARÂMETROS DE JOB........................................................................................................................................... 17
20. ANEXO I: PARÂMETROS DO COMPILADOR PL/I OPTIMIZING...........................................................................18
- 2 -
1. ESTRUTURA PADRÃO DE UM PROGRAMA PL/I
LABEL: PROC OPTIONS (MAIN) ; Identificação do programa
DECLARE arquivos , Declaração de variáveis campos , PICTUREs de edição , tabelas , estruturas , inicializações , redefinições , funções (BUILT-IN) , rotinas externas;
ON CONDITIONS ; Tratamento de condições
COMANDOS ; Comandos / Instruções movimentações ; expressões ; concatenação ; condições ; LOOPs ; manipulação de arquivos ; manipulação de banco de dados ; chamadas de rotinas internas; chamadas de rotinas externas; COMANDOS ;
ROT-LABEL: PROC ; Identificação da Sub-rotina interna
END ROT-LABEL ; Finalização da Sub-rotina interna
END LABEL ; Finalização do programa
2. SINTAXE DO COMANDO PL/I
<instrução> ;
Qualquer comando / comentário PL/I deverão ser codificados entre as colunas 2 a 72
O término de qualquer comando PL/I é identificado por ponto e vírgula (;)
Um comando PL/I poderá ser codificado em uma ou mais linhas
Não há posição nem caracter para indicar a continuação de um comando PL/I
O comentário em PL/I deverá estar codificado entre os caracteres "/*" (abre comentário) e os caracteres "*/" (fecha comentário)
O comentário PL/I poderá ser condificado em qualquer ponto do fonte e poderá ser de uma ou mais linhas
Não existem palavras reservadas no PL/I
O ponto decimal no PL/I é sempre o ponto (.)
Caracteres minúsculos NÃO são aceitos
3. CARTÃO COMENTÁRIO OBRIGATÓRIO PELA INSTALAÇÃO
Todo e qualquer programa PL/I da instalação deverá ter o seguinte cartão comentário codificado no início do fonte:
2 10 20 60 72 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7.. /* PROGRAMA DESCRIÇÃO DO PROGRAMA USERID */ | | | | | USERID DO ANALISTA | | | DESCRIÇÃO SUMÁRIA DO PROGRAMA
- 3 -
| NOME DO PROGRAMA
4. IDENTIFICAÇÃO DO PROGRAMA
PROGRAMA PRINCIPAL
label : PROC (parâmetro) OPTIONS (MAIN);
-- PROGRAMA --
END label;
Label: De 1 a 8 caracteres alfanuméricos, iniciando sempre por um caracter alfabético
SUB-ROTINA INTERNA OU EXTERNA
label : PROC (parâmetro);
-- SUB-ROTINA --
END label;
Label: SUB-ROTINA INTERNA: De 1 a 29 caracteres alfanuméricos e caracteres especiais ('#', '@', '$' e '_'), iniciando sempre por um caracter alfabético
SUB-ROTINA EXTERNA: De 1 a 7 caracteres alfanuméricos, iniciando sempre por um caracter alfabético
5. DECLARAÇÕES
5.1. DECLARAÇÃO DE ARQUIVOS
DCL <identificação> FILE <tipo> <operação> ENV (<DCB> <opções>);
IDENTIFICAÇÃO
É a mesma identificação (DDNAME) utilizada no cartão DD do JCLDCL ARQENT FILE ...; | |//ARQENT DD DSN=...
TIPO
RECORD – arquivo tipo registro
STREAM – arquivo tipo cadeia
OPERAÇÃO
INPUT – somente leitura
OUTPUT – somente gravação
UPDATE – leitura / atualização
DCB
Formato do Registro que pode ser:F – Fixo FB - Fixo BlocadoV – Variável VB - Variável Blocado
Cláusula RECSIZE – Define-se o tamanho do registroEx.: DCL ARQ FILE RECORD INPUT ENV (F RECSIZE(100));
OPÇÕES
TOTAL – Otimização das rotinas de leitura e gravação
CTLASA – Indica que o caracter de espacejamento está colocado na primeira posição da linha de impressão.
Caracteres Válidos:' ' imprime na linha seguinte'0' salta uma linha'-' salta duas linhas'1' salta para a página seguinte'+' imprime na mesma linha
- 4 -
Ex.: DCL ARQ FILE RECORD INPUT ENV (F RECSIZE(100) CTLASA TOTAL);
5.2. DECLARAÇÃO DE CAMPOS
DCL <identificação> <ocorrência> <tipo> (<tamanho><,decimais>) <alocação> INIT(<inicialização>);
IDENTIFICAÇÃO
29 caracteres de nome NÃO podendo iniciar por número
Caracteres alfabéticos (A ~ Z), numéricos (0 ~ 9) e alguns caracteres especiais ('#', '@', '$' e '_')
TIPO
CHARACTER (CHAR) - alfanumérico
PICTURE (PIC) – numérico zonado
DECIMAL FIXED (FIXED) – numérico compactado
DECIMAL FLOAT (FLOAT) – numérico ponto flutuante
BINARY FIXED (BIN FIXED) – numérico binário
POINTER – endereço
TAMANHO
CHAR – de 1 à 32767Ex.: CHAR(10)
PIC – de 1 a 15 (inclusive decimais)Ex.: PIC '(15)9' pic '(13)9V99' - 15 dígitos onde 13 inteiras e 2 decimais
FIXED – de 1 a 15 (inclusive decimais)Ex.: FIXED(15) FIXED(15,2) – 15 dígitos onde 13 inteiras e 2 decimais
FLOAT – de 1 a 33 (não há decimais)Ex.: FLOAT(06)
BIN FIXED – 15 (2 bytes) ou 31 (4 bytes) (não há decimais)Ex.: BIN FIXED(15) / BIN FIXED(31)Não utilizar para operações de multiplicação e divisão com campos que contenham decimais.
POINTER – tamanho implicitamente definido (4 bytes)Ex.: POINTER
BIT – utilizado para testes lógico / zero (0) é falso e 1 (um) é verdadeiro)Ex.: BIT(01)
OCORRÊNCIA
Definição de tabela (ARRAY)
Índices variando de –32766 a 32767
UnidimensionalEx.: TAB(10) 10 ocorrências (de 1 a 10) TAB(-4:10) 15 ocorrências (de –4 a 10 inclusive 0)
Multidimensional até 9 dimensõesEx.: TAB(10,10) / TAB(5,5,5) TAB(-4:10,5,20,10)
ALOCAÇÃO
Dinâmica: BASED / CONTROLLEDEx.: CHAR(10) BASED / CHAR(10) CONTROLLED
Automática: AUTOMATICEx.: PIC '(10)9' ou PIC '(10)9' AUTOMATIC
- 5 -
Estática: STATICEx.: FIXED(15) STATIC
Variável: VARYING (VAR)Ex.: CHAR(15) VAR
INICIALIZAÇÃO
Cláusula INIT
Alfanumérico – INIT(' ') / INIT(' ') / INIT((10)' ')
Ex.: CHAR(15) INIT(' ')
Numérico – INIT(0)
Ex.: FIXED(15) INIT(0) / PIC'(09)9' INIT(12345)
BIT – INIT('0'B) / INIT('1'B)
Ex.: BIT(1) INIT('0'B) / INIT('1'B)
Tabela alfanuméricaEx.: TAB(5) CHAR(15) INIT((5)(01)' ') / INIT((05)(' ')) / INIT('A','B','C','D','E')
Obs: TAB(5) CHAR(15) INIT((5)(01)' ') | | FATOR DE INDEXAÇÃO FATOR DE REPETIÇÃO
Tabela numéricaEx.: TAB(5) FIXED(15) INIT((5)0) / INIT(1,2,3,4,5)
Inicialização durante execução: TAB(*) = 0;
Tabela multidimensionalEx.: TAB(2,2) FIXED(15) INIT((4)0) / INIT(1,2,3,4) | | | | ocorrência (1,1) | | | ocorrência (1,2) | | ocorrência (2,1) | ocorrência (2,2)
Inicialização durante execução: TAB(*,*) = 0;
EXEMPLOS DE DECLARAÇÃODCL AGENCIA PIC '(04)9' INIT(0);
DCL NOME_DA_AGENCIA CHAR(45) INIT(' ');
DCL TAB$CONTA(10) FIXED(07) INIT((10)0), @AGENCIA(10) CHAR(45) INIT((10)('NOME DA AGENCIA'));
5.3. MÁSCARA DE EDIÇÃO PARA CAMPO NUMÉRICO ZONADO (PIC)PIC '(4)9' ou PIC '9999'PIC '99/99/99' - 261201 -> 26/12/01PIC '**.**9,99' - 64930 -> ***649,30PIC 'ZZ.Z99V,99' - 1649.637 -> 1.649,63PIC 'ZZ9+' - +37 -> 37+ -37 -> 37PIC 'ZZ9-' - +37 -> 37 -37 -> 37-PIC 'ZZ9S' - +37 -> 37+ -37 -> 37-
5.4. CAMPO NUMÉRICO ZONADO (PIC) COM SINAL
SEM SINAL (valor absoluto)PIC '(04)9' ou PIC '9999' 1234
|F|1|F|2|F|3|F|4| -----------------
COM SINALPIC '(03)9T' ou PIC '999T' 4 dígitos e sinal no último dígito
- 6 -
representado pela letra "T"
Conteúdo : +1234 -1234
|F|1|F|2|F|3|C|4| |F|1|F|2|F|3|B|4| ----------------- ----------------- | | Sinal Positivo Sinal Negativo
5.5. CAMPO DE TAMANHO VARIÁVEL (VARYING)
Especifica um campo de tamanho variável, embora seja declarado pelo máximo de dígitos que possa conter, ele assume o tamanho do conteúdo que lhe é atribuído.EX. X CHAR(10) VAR, X = 'ABC' -> TAMANHO DE X = 3 X = 'ABCDE' -> TAMANHO DE X = 5
OBS. O tamanho do campo é controlado internamente por um campo BIN FIXED(15) colocado antes do campo. Este tamanho pode ser acessado através de uma redefinição do campo.EX. TAM BIN FIXED(15) DEF X,
5.6. ESTRUTURAS
Os sub-níveis devem descrescer mas não necessita ser de modo sequencialEX. 1 ENTRADA, 1 ENTRADA, 2 AGENCIA PIC '(4)9', 3 AGENCIA PIC'9999', 2 CONTA PIC '(7)9', 3 CONTA PIC'(07)9', 2 NOME CHAR (40), 3 NOME CHAR(40), 2 ENDERECO, 3 ENDERECO, 3 RUA CHAR (30), 5 RUA CHAR(30), 3 NUMERO PIC '(6)9', 5 NUMERO PIC'(06)9', 2 DATA CHAR (6), 3 DATA CHAR(06),
5.7. DECLARAÇÃO DE ESTRUTURA VIA "LIKE"
Usado para declaração de estruturas iguais.EX. 1 ENTRADA, 2 AGENCIA PIC '(4)9', 2 ENDERECO, 3 RUA CHAR (30), 3 NUMERO PIC '(6)9', 2 DATA CHAR (6),
1 SAIDA LIKE ENTRADA,
A estrutura "SAIDA" terá os mesmos nomes, atributos e inicializações de modo idêntico da estrutura "ENTRADA".EX. 1 ENTRADA, 2 AGENCIA PIC '(4)9', 2 ENDERECO, 3 RUA CHAR (30), 3 NUMERO PIC '(6)9', 2 DATA CHAR (6),
1 AUX, 2 CHAVE CHAR (51), 2 END LIKE ENTRADA.ENDERECO,
A sub-estrutura "END" terá os mesmos campos com atributos e inicializações de modo idêntico ao sub-nível "ENDERECO".
5.8. REDEFINIÇÃOEX. C_P_F PIC '(12)9'EX. CPF CHAR (12) DEF C_P_F,
DATA CHAR(06), 1 DATAS, 1 DATAS DEF DATA, 2 DIA PIC '99', 2 DIA PIC '99', 2 MES PIC '99', 2 MES PIC '99', 2 ANO PIC '99', 2 ANO PIC '99', DATA CHAR(06) DEF DATAS,
- 7 -
EX. 1 CADASTRO, 2 NOME CHAR(45), 2 ENDERECO, 3 RUA CHAR(25), 3 NUMERO PIC '99999', 2 COMPLEMENTO, RUA_NUMERO CHAR(30) DEF ENDERECO,
5.9. REDEFINIÇÃO POSICIONALEX. DATA CHAR(06), DIA CHAR(02) DEF DATA POS(5), MES CHAR(02) DEF DATA POS(3), ANO CHAR(02) DEF DATA POS(1),
EX. AREA CHAR (50), NOME CHAR (30) DEF AREA POS(11),
EX. 1 CADASTRO, 2 NOME CHAR(45), 2 ENDERECO, 3 RUA CHAR(25), 3 NUMERO PIC '99999', 2 COMPLEMENTO, RUA_NUMERO CHAR(30) DEF CADASTRO POS(46),
5.10. IMPORTANTE / CUIDADO
Toda e qualquer variável não declarada explicitamente no programa, o PL/I irá assumir (declarar) implicitamente de acordo com a seguinte regra: Toda variável iniciada pela letra "I" a "N" será assumido como sendo "BIN FIXED(15),e as outras serão assumidas como "FLOAT(6)".
6. COPY-BOOK (INCLUDE)
SINTAXE%INCLUDE MAC01 (<nome do COPY-BOOK>);
EX. DCL 1 AGE, %INCLUDE MAC01 (GEAGEAG);
7. TRATAMENTO DE CONDIÇÃO DE EXCEÇÃO (ON conditions) Devem ser condificados preferencialmente após as declarações de variáveis e antes de qualquer comando executável. Pois o tratamento de condição de exceção só é ativado quando o fluxo da execução passar pelas instruções ON condition. As instruções incorporadas nos comando ON condition serão executadas somente quando ocorrer a condição de exceção.
ON ENDFILE
Prevê condição para fim de arquivo.EX. ON ENDFILE (ARQUIVO) --COMANDO-- ;
EX. ON ENDFILE (ARQUIVO) BEGIN; --COMANDOS--; END;
ON ERROR
Prevê condição para qualquer tipo de ABEND.EX. ON ERROR SNAP BEGIN; ON ERROR SYSTEM; --COMANDOS--; CALL ABEND; END;
- 8 -
8. MANIPULAÇÃO DE ARQUIVO
8.1. ARQUIVO TIPO "RECORD"
ABRIR/FECHAR
OPEN FILE (ARQUIVO1);OPEN FILE (ARQUIVO1), FILE (ARQUIVO2);
CLOSE FILE (ARQUIVO1);CLOSE FILE (ARQUIVO1), FILE (ARQUIVO2);
LEITURA
READ FILE (ENTRADA) INTO (AREA);
READ FILE (ENTRADA) SET (P); (usado para leitura de áreas BASED)
GRAVAÇÃO
WRITE FILE (SAIDA) FROM (AREA);
8.2. ARQUIVO TIPO STREAM-ORIENTED OUTPUT - SYSPRINT
GRAVAÇÃO
PUT DATA------Imprime o nome e o conteúdo do campoEX. PUT DATA (NOME,VALOR);
DADOS: NOME = 'JOAO', VALOR = 339
EX. PUT DATA;
CUIDADO: Serão listados todos os nomes e conteúdos de todos os campos do programa
PUT LIST-------Imprime somente o conteúdo do campoEX. PUT LIST (NOME,VALOR);
RESULTADO: JOAO 339
PUT EDIT-------Imprime campos e literaisEX. PUT LIST (NOME,VALOR);
RESULTADO: JOAO 339
EX. PUT EDIT (NOME,'PAGOU',VALOR) (X(5),A(25),A(10),P'Z9.9'); | | | | | NUMERO | CARACTER | BRANCOS
---> JOAO CARLOS ARRUDA PAGOU 83.4
Opções de espacejamento de impressão válida para todos os tipos acima
SKIP Mudança de linha
SKIP(n) Salta "n" linhas
COL(n) Salta "n" colunas
PAGE Mudança de página
EX. PUT SKIP LIST(NOME,VALOR); PUT PAGE EDIT(NOME,VALOR)(A(20),SKIP(2),P'ZZZV,9');
9. DESVIO INCONDICIONAL
Comando para fazer um desvio do fluxo de execução para um LABEL qualquer especificado no comando.
GO TO <LABEL>;
EX. IF CNT > 10 THEN
GO TO ULTRAPASSOU_LIMITE;
...
- 9 -
...
ULTRAPASSOU_LIMITE: --COMANDOS—
10. ATRIBUIÇÃO
ATRIBUIÇÃO SIMPLESCAMPO = VALOR;
ATRIBUIÇÃO MÚLTIPLAPAG, NPAG = NPAG + 1;
ATRIBUIÇÃO POR IGUALDADE DE NOME (opção BY NAME)
Movimentação das variáveis de uma estrutura para outra que possuam os mesmos nomes de variáveisSAIDA = VALOR, BY NAME;
ATRIBUIÇÃO POR QUALIFICAÇÃO DE NOME
Movimentação de variáveis que possuem o mesmo nome em estruturas ou níveis diferentes.SAIDA.VALOR = ENTRADA.VALOR * 100;
11. EXPRESSÕES E OPERAÇÕES
OPERANDOS ARITMÉTICOS:
Exponenciação: **Ex: A = A ** 3
Multiplicação: *Ex: A = B * C
Divisão: /Ex: A = B / C
Infixo: +, -
Prefixo: +, -
Concatenação: ||Ex: A = 'AB', B = 'CD', C = A || B C = 'ABCD'
OPERANDOS DE COMPARAÇÃO:
Igual: =Ex: IF A = 0 THEN
Negativa: ¬Ex: IF ¬(A = 0) THEN
BIT STRING: DCL FIMARQ BIT(01) INIT('0'B); IF ¬FIMARQ THEN
Diferente: ¬=Ex: IF A ¬= 0 THEN
Maior que: >Ex: IF A > 0 THEN
Menor que: <Ex: IF A < 0 THEN
Maior igual que: >=Ex: IF A >= 0 THEN
Menor igual que: <=Ex: IF A <= 0 THEN
Não maior que: ¬>Ex: IF A ¬> 0 THEN
Não menor que: ¬<Ex: IF A ¬< 0 THEN
- 10 -
E (AND): &Ex: IF A = 0 & B = 0 THEN
Ou (OR): |Ex: IF A = 0 | B = 0 THEN
PRIORIDADE DAS EXPRESSÕES
1. Expressões entre parênteses
2. Prioridade dos operandos
3. Dentro da mesma prioridade da esquerda para a direita
PRIORIDADES DOS OPERANDOS
1. **, ¬, +(PREFIXO), -(PREFIXO)
2. *, /
3. +(INFIXO), -(INFIXO)
4. ||
5. >, >=, =, ¬=, <=, <, ¬>, ¬<
6. &
7. |
Exemplo: B | C & D -> B | (C & D)¬B | C -> ¬(B | C)
TABELA DE RESULTADO BOOLEANOA B ¬A ¬B A&B A|B1 1 0 0 1 11 0 0 1 0 10 1 1 0 0 10 0 1 1 0 0
12. OPERAÇÕES DE COMPARAÇÃO
As operações de comparações são feitas da esquerda para a direita BIT a BIT.
COMPARAÇÃO ENTRE CHARACTER
A comparação é feita da esquerda para a direita, sendo um caracter dos operandos menor que o outro o campo é preenchido à direita com brancos para comparação.
COMPARAÇÃO ENTRE BIT STRING
A comparação é feita da esquerda para a direita com dígitos binários, sendo um dos operandos menor o campo é preenchido à direita com zeros binários.
COMPARAÇÃO NUMÉRICAS
A comparação é feita pelo valor númerico dos operandos.
13. COMANDO "IF"
Comando para comparação e tomada de ação de acordo com a veracidade da condição. (THEN – verdade / ELSE – falso).
- 11 -
SINTAXE
IF --<condição>-- THEN --<comando>--; ELSE --<comando>--;
14. COMANDO "SELECT"
Comando de tomada de decisão e ação em uma estrutura de "CASE" de acordo com o valor ou a veracidade da condição. (verdade executa / falso testa o próximo valor ou condição).
SINTAXESELECT (<campo>); WHEN (<valor> ou <condição>) --<comando>--; ... WHEN (<valor> ou <condição>) --<comando>--; OTHERWISE --<comando>--;END;
EXEMPLOSELECT (A); WHEN (1,2) B = A * 2; Executa se A = 1 ou A = 2 WHEN (3) B = A / 2; Executa se A = 3 OTHERWISE B = 0; Executa se A <= 0 ou A > 3END;
SELECT; WHEN (A = 1 | A = 2) B = A * 2; WHEN (A = 3) B = A / 2; OTHERWISE B = 0;END;
15. COMANDO "DO"
AGRUPAMENTOIF --CONDICAO—- THEN DO; --COMANDOS--; END;ELSE DO; --COMANDOS--; END;
SELECT WHEN (...) DO; --COMANDOS--; END; ... OTHERWISE DO; --COMANDOS--; END;END;
REPETITIVO
Executa as instruções várias vezes quanto definido no limite de repetição especificado no comando onde a variável de controle de repetição é incrementado de acordo com o valor de incremento definido também no comando. O valor de incremento quando não é especificado assume-se o valor 1.DO I = 0 TO 10 BY 2; Executa 6 vezes com iteração de 2 --COMANDOS--; unidadesEND;
- 12 -
VARIAVEL
Executa as instruções várias vezes quantas definidas pela quantidade de valores de atribuição especificados no comando.DO I = 1,7,9,5,11; --COMANDOS--;END;
CONDICIONAL WHILE
Executa os comandos enquanto a condição especificada no comando for verdadeira.DO WHILE (--CONDICAO--); --COMANDOS--;END;
CONDICIONAL UNTIL
Executa as instruções até que a condição especificada no comando se torne verdadeira. Executa ao menos uma vez, pois o teste de validação da condição é feita no final.DO UNTIL (--CONDICAO--); --COMANDOS--;END;
CONDICIONAL MISTO
Combinações dos processos repetitivos descritos anteriormente.DO COD = 1 TO 10 WHILE (--CONDICAO--); --COMANDOS--;END;
16. BLOCOS São conjuntos de comandos em PL/I que servem para informar ao compilador a necessidade de tratamento especial durante a compilação, além da simples tradução dos comandos que contém.
Os blocos dão à linguagem a característica de se poder fazer alocação dinâmica de memõria. As variáveis alocadas no início da execução ou ativação de um bloco são desalocadas ao seu término.
Existem dois tipos de bloco: "PROCEDURE" e "BEGIN".
BEGIN
O nome (rótulo/LABEL) para estes tipo de blocos é opcional pois são ativados na sequência que aparecem no programa.
PROCEDURE
Todo programa é composto de pelo menos 1 bloco "PROCEDURE", o bloco principal (a MAIN PROCEDURE).
Obrigatoriamente estes blocos devem ter nome (rótulo/LABEL) para poderem ser ativados. Os blocos que não sejam o bloco principal são mais conhecidos como sendo uma sub-rotina interna.
Este tipo de bloco pode haver definições de variáveis locais e de manipulação de parâmetros.
A execução destes blocos são feitos através do comando "CALL". Logo estes blocos não precisam ser "SALTADOS" pela lógica do programa para atingir o final do programa.
CHAMADA DE SUB-ROTINA INTERNASem parâmetros: CALL SUB_ROTINA_INTERNA;Com parâmetros: CALL SUB_ROTINA_INTERNA(PARM1,PARM2,PARM3);
CHAMADA DE SUB-ROTINA EXTERNASem parâmetros: CALL SUBROT1;Com parâmetros: CALL SUBROT2(PARM1,PARM2,PARM3);
RECEPÇÃO DE PARÂMETROSSUBROT1: PROC(PARM1,PARM2,PARM3);DCL PARM1 CHAR(10), PARM2 PIC'9999', PARM3 FIXED(15,2);
Recomenda-se a utilização de estrutura como passagem de parâmetros, ver abaixo:- 13 -
SUBROT1: PROC(PARMAMETRO);DCL 1 PARAMETRO, 2 PARM1 CHAR(10), 2 PARM2 PIC'9999', 2 PARM3 FIXED(15,2);
SEQUÊNCIA DE EXECUÇÃO DOS BLOCOSORDEM DE PROG: PROCEDURE OPTIONS (MAIN);EXECUCAO DCL (A,B) .... 01 . 02 CALL PROCESSO; 05 . 06 BLOCO_1: BEGIN; DCL V(10000) .... 07 . END; 08 . 09 BEGIN; 10 . END; 11 . 03 PROCESSO: PROCEDURE; DCL (X,Y,MAT).... 04 . END PROCESSO; 12 END PROG;
MAPA DE BLOCOS/VARIÁVEIS GLOBAIS E LOCAIS
+----------------------------------------------------------------+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| P1 OPTIONS (MAIN) V1 ||||||||||||||||||||||||||||||||||||||||||||+--------------------------------------------------+||||||||||||||| P11 V11 |||||||||||||||| +----------------------------------------+ |||||||||||||||| | P111 V111 |||||||||||||||||||||||||||| |||||||||||||||| +----------------------------------------+ |||||||||||||||| |||||||||||||||+--------------------------------------------------+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||+--------------------------------------------------+||||||||||||||| P12 V12 |||||||||||||||| +----------------------------------------+ |||||||||||||||| | P121 V121 |||||||||||||||||||||||||||| |||||||||||||||| +----------------------------------------+ |||||||||||||||| |||||||||||||||+--------------------------------------------------+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||+----------------------------------------------------------------+P --> BLOCOS PROCEDUREV --> VARIAVEIS
QUEM CHAMA QUEM: P1 : P11 P12 P1 P11 : P111 P12 P11 P111 : P12 P11 P111 P12 : P121 P11 P12 P121 : P12 P11 P121
QUEM USA QUEM: P1 : V1 P11 : V1 V11 P111 : V1 V11 V111 P12 : V1 V12 P121 : V1 V12 V121
- 14 -
17. FUNÇÕES - BUILTIN
ARITMÉTICAS
MULTIPLY(A,B,I,J)
Fornece o resultado da multiplicação entre "A" e "B" com a precisão de cálculo interno de "I" dígitos com "J" decimaisEX. RESULTADO = MULTIPLY(NUMERO1,NUMERO2,15,5);
DIVIDE(A,B,I,J)
Fornece o resultado da divisão entre "A" e "B" com a precisão de cálculo interno de "I" dígitos com "J" decimaisEX. RESULTADO = DIVIDE(NUMERO1,NUMERO2,15,5);
MOD
Fornece o resto de uma divisão.EX. RESTO = MOD(NUMERO,DIVISOR);
IF MOD(ANO,4) = 0 THEN MENSAGEM = 'ANO BISSEXTO';
ROUNDROUND(X1,X2) retorna o valor arredondado de X1, X2 indicando em qual casa a direita será efetuado o arredondamento
TRATAMENTO DE STRING
VERIFY(A,B)
Retorna a posição no STRING "A" do primeiro caracter ou BIT que não está no STRING "B". Se todos os caracteres em "A" estão em "B" o resultado é zero.EX. X = VERIFY(CAMPO,'ABHNR'); SE CAMPO = 'BRANCO' -> X = 5 SE CAMPO = 'BANHA' -> X = 0
IF VERIFY(NUM,'0123456789') ¬= 0 THEN MENSAGEM = 'NUM NAO NUMERICO';
INDEX(A,B)
Retorna a posição inicial do STRING "B" dentro do STRING "A", retorna zero se o mesmo não está presente.EX. DCL LETRA CHAR(10) INIT('ABCDEFGHI'), X = INDEX(LETRA,'E') -> X = 5 Y = INDEX(LETRA,'DE') -> Y = 4
SUBSTR(A,B,C)
A - CAMPOB - POSIÇÃO INICIALC - QUANTIDADE DE DÍGITOS
Permite o acesso a uma parte de um campo para exame ou modificação do seu conteúdo. Se "C" é omitido o resto do STRING é incluído.EX. DCL CAMPO CHAR(10) INIT('012345ABCD'), SUBSTR(CAMPO,5,3) = 'XYZ'; --> CAMPO = 01234XYZBCD
LENGTHLENGTH (X1) retorna um valor igual ao comprimento de X1.
- 15 -
HIGH(N)
Retorna um caracter STRING de tamanho n com o caracter de mais alto valor em hexadecimal "FF".
EX. DCL CAMPO CHAR (06), CAMPO = HIGH(06);
LOW(N)
Retorna um caracter STRING de tamanho n com o caracter de mais baixo valor em hexadecimal "00".
EX. DCL CAMPO CHAR (06), CAMPO = LOW(06);
TRATAMENTO DE ARRAYS
LBOUNDLBOUND (X1,N) retorna o valor de limite inferior da "N-esima" dimensao do "array" especificado como argumento
HBOUNDHBOUND (X1,N) retorna o valor de limite superior da "N-esima" dimensao do "array" especificado como argumento.
OUTROS
PLIRETC
Permite ao programa passar um código de retorno para os cartões de controle. Seta o "COND CODE" do STEP do JOB com o valor especificado.EX. DCL COND BIN FIXED(31) STATIC INIT(0), IF --CONDICAO-- THEN COND = 1; ELSE COND = 2; CALL PLIRETC (COND);
DATE
Fornece a data do dia no formato ano-mês-dia (CHAR(06) - AAMMDD).EX. DCL DATA CHAR(06), DATE BUILTIN; DATA = DATE; ---> DATA = 010227
TIME
Fornece o horário no formato hora-minuto-segundo-milésimo de segundo (CHAR(09) - HHMMSSMMM).EX. DCL HORA CHAR(09), TIME BUILTIN; HORA = TIME; ---> HORA = 091033683
18. RECURSOS DE DEBUG
SUBSCRIPTRANGE
Usado para verificar se houve estouro de alguma tabela dentro do programa, quando detectado a invasão de área a execução é interrompida.EX. /* PROGRAM PROGRAMA EXEMPLO USERID */ (SUBRG): DICONS: PROC OPTIONS (MAIN); ---- ON SUBRG BEGIN; PUT DATA (I,J,K); ---- END;
- 16 -
CHECK
Controla variáveis do programa, listando-as a cada execução de instruções onde elas aparecem.EX. /* PROGRAMA PROGRAMA EXEMPLO USERID */ (CHECK): FCINTRV: PROC OPTIONS (MAIN);
/* PROGRAMA PROGRAMA EXEMPLO USERID */ (CHECK(FATOR,TAXA,RAZAO)): ABTOTS: PROC OPTIONS (MAIN);
19. PARÂMETROS DE JOB
São informações passadas ao programa através do cartão JCL "EXEC" através de da opção "PARM"
O parâmetro no JCL deverá ser informado como mostrado no exemplo seguinte:
PRODUÇÃO// EXEC PGM=PROGRAMA,PARM='ISA(100)K,STAE,SPIE/<parâmetros>' | V O PARAMETRO DEVERÁ SER INFORMADO AQUI
DESENVOLVIMENTO// EXEC ADGO,MEMBER=PROGRAMA,NBIBL=00,PARAM='<parâmetros>' | V O PARAMETRO DEVERÁ SER INFORMADO AQUI
No programa deverá estar codifica como mostrado a seguir, sendo o parâmetro declarado obrigatoriamente como VARYING. O tamanho máximo de parâmetro que pode ser enviado do JOB para a aplicação é de 100 bytes.PROGRAMA: PROC (PARAMETRO) OPTIONS (MAIN);DCL PARAMETRO CHAR (10) VAR, 1 PARM_DEF DEF PARAMETRO, 2 TAMANHO BIN FIXED(15), 2 CAMPO CHAR (10);...IF TAMANHO = 0 THEN ... /* faltou passar parâmetro */ELSE IF CAMPO = 'PARAMETRO1' THEN ...
20. Anexo I: Parâmetros do Compilador PL/I Optimizing
Parametros mais usados
O compilador PL/I OPTIMIZING fornece uma serie de opcoes, tanto em tempo de compilacao como em tempo de execucao. As opcoes que sao fornecidas em tempo de compilacao sao chamadas de "opcoes de compilacao" e aquelas fornecidas em tempo de execucao, "opcoes em tempo de execucao".
As opcoes mais utilizadas sao as seguintes: AGGREGATE (NOGGREGATE)
indica ao compilador para listar ( AG) ou nao (NAG) a relacao das estruturas principais e tabelas do programa, bem como seus respectivos tamanhos.
COUNT (NOCOUNT) o compilador produz no objeto, codigo que a tempo de execucao conta e lista ao fim do programa quantas vezes a instrucao foi executada.
FLOW (NOFLOW) o compilador produz no objeto, codigo que ao termino do programa lista os ultimos "n" desvios executados nas ultimas "m" procedures. Formato: FLOW (n,m) - default p/ (n,m) e' (25,10)
GOSTMT (NOGOSTMT)
especifica que o numero da instrucao no programa fonte deve ser incluido em mensagens enviadas em tempo de execucao.
INCLUDE permite ao compilador o uso de texto em programas que usam a instrucao
- 17 -
(NINCLUDE)
"%INCLUDE". Para programas que utilizam esta instrucao e nao utilizam outras instrucoes do "pre-processador", este metodo e' mais rapido que utilizando o "pre-processador". Se a opcao MACRO for tambem utilizada, a opcao INCLUDE nao tem efeito.Abreviacao: INC e NOINC
INSOURCE (NOINSOURCE)
informa ao compilador para incluir uma lista do programa fonte (inclusive instrucoes do "pre-processador") na listagem da compilacao. Abreviacao: IS ou NIS
INTERRUPT (NOINTERRUPT)
PL/I intervem (INT) ou nao (NOINT) em caso de ABEND. Quando intervem, devolve o "system code" correspondente. Quando se deseja o DUMP, utilizar NOINT.
ISASIZE indica o tamanho da area ISA (Initial Storage Area), onde serao alocadas as "SAVE AREAS", "AREAS AUTOMATICAS" e "AREAS CONTROLLED".
LIST (NOLIST) indica ao compilador para incluir uma listagem do modulo objeto, em ASSEMBLER.
MACRO (NOMACRO) especifica que o programa fonte deve ser processado pelo "pre-processador".Formatos: MACRO=M ou NOMACRO (abreviaturas: M ou NM)
MAP (NOMAP) indica ao compilador para produzir uma tabela de "off sets" (localizacao das variaveis) das areas "static" e "automatic" do programa. Nao sao mostradas as areas com atributo "DEF".
REPORT (NOREPORT)
especifica que um relatorio da utilizacao de memoria pelo programa sera' gerado e listado no PLIDUMP ou PL1DUMP. Util para a determinacao do ISASIZE ideal.
SPIE (NOSPIE) especifica que quando ocorrer uma interrupcao de programa (OC1,...,OCF), as rotinas do PL/I devem interceptar, e em certas circunstancias, dar condicao ERROR
STAE (NOSTAE) especifica que quando ocorrer um ABEND (programado), as rotinas do PL/I devem interceptar e dar condicao ERROR ou produzir mensagem de diagnostico e um PLIDUMP.
OFFSET (NOOFFSET)
imprime ou nao os "off sets" das instrucoes e procedures dentro do programa.
XREF (NOXREF) (SHORT|FULL)
indica para incluir lista de referencia cruzada de variaveis (onde sao declaradas e em que instrucoes sao usadas).
As "opcoes de execucao" sao: COUNT (NOCOUNT), FLOW (NOFLOW), ISASIZE, REPORT (NOREPORT), SPIE (NOSPIE), STAE (NOSTAE).
BIBLIOGRAFIA OS PL/I OPTIMIZING COMPILER: Programmer's Guide (Chapter 4 - The Compiler) OS PL/I Checkout and Optimizing Compilers: Language Reference Manual (Section G: Built-in Functions and Pseudovariables)
- 18 -