hamacker

FirebirdSQL Example

Feb 20th, 2024 (edited)
547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 10.98 KB | Source Code | 0 0
  1. /*
  2.   Nome: clientes.sql
  3.   Função: criar e atualizar os objetos dentro do banco de dados "lazdemos_gsl.fdb".
  4.           Foco na criação e atualização da tabela "CLIENTES".
  5.   Observação: Ao executar usando:
  6.         >isql -ch iso8859_1 -i <script.sql>
  7.         retorna uma mensagem dizendo:
  8.         "Rolling back work."
  9.         Apesar disso, todo funcionou direitinho.
  10.   Data: 20/02/2024
  11.   Autor: Hamacker <sirhamacker [em] gmail.com>
  12. */
  13. /*
  14. Function: create and update objects within the "lazdemos_gsl.fdb" database.
  15.            Focus on creating and updating the "CLIENTES" table.
  16.    Note: When running using:
  17.          >isql -ch iso8859_1 -i <script.sql>
  18.          returns a message saying:
  19.          "Rolling back work."
  20.          Despite this, everything worked fine. Maybe this message is a bug.
  21. */
  22. SET SQL dialect 3;
  23. SET clientlib 'fbclient.dll';
  24. CONNECT 'C:\Projetos-fpc\lazdemos_gsl\db\LAZDEMOS_GSL.FDB';
  25. SET autoddl ON;
  26. SET names iso8859_1;
  27. SET transaction
  28.   read WRITE
  29.   ISOLATION LEVEL read committed
  30.   wait
  31.   LOCK timeout 180;
  32.  
  33. CREATE OR ALTER EXCEPTION ERR 'Erro generico, favor verificar COM ATENÇÃO';
  34. GRANT USAGE ON EXCEPTION ERR TO PUBLIC;
  35.  
  36. SET TERM ^;
  37. EXECUTE block AS
  38. DECLARE variable existe BOOLEAN;
  39. BEGIN
  40.   existe=FALSE;
  41.   IF (EXISTS(SELECT * FROM  RDB$RELATIONS WHERE RDB$RELATION_NAME='CLIENTES' )) THEN
  42.     existe=TRUE;
  43.   IF (NOT existe) THEN
  44.   BEGIN
  45.     EXECUTE statement
  46.       '
  47.      CREATE TABLE CLIENTES (
  48.        ID_CLIENTE BIGINT generated by default as identity not null,
  49.        NOME_COMPLETO CHAR(120),
  50.        STATUS CHAR(1) DEFAULT ''A'') ;
  51.      ';
  52.   END
  53. END
  54. ^
  55.  
  56. COMMIT;^
  57.  
  58. -- Comentar a tabela
  59. COMMENT ON TABLE CLIENTES IS 'Relação de clientes';^
  60. COMMENT ON COLUMN CLIENTES.ID_CLIENTE IS 'Codigo do cliente';^
  61. COMMENT ON COLUMN CLIENTES.NOME_COMPLETO IS 'Nome do cliente';^
  62. COMMENT ON COLUMN CLIENTES.STATUS IS 'Situação do cliente(A=Ativo, C=Cancelado)';^
  63.  
  64. -- Permissão a tabela
  65. grant SELECT ON clientes TO PUBLIC; ^
  66. grant SELECT, DELETE, INSERT, UPDATE ON clientes TO SYSDBA; ^
  67.  
  68. COMMIT;^
  69.  
  70. -- Apagando chave prinmaria antiga
  71. EXECUTE block AS
  72. DECLARE variable existe BOOLEAN;
  73. BEGIN
  74.   existe=FALSE;
  75.   IF (EXISTS(
  76.        SELECT * FROM rdb$relation_constraints
  77.        WHERE rdb$constraint_name='PK2_CLIENTES' )) THEN
  78.     existe=TRUE;
  79.   IF (existe) THEN
  80.   BEGIN
  81.     EXECUTE statement
  82.       '
  83.      ALTER TABLE CLIENTES DROP CONSTRAINT PK2_CLIENTES;
  84.      ';
  85.   END
  86. END
  87. ^
  88.  
  89. COMMIT;^
  90.  
  91. -- Chave prinmaria
  92. EXECUTE block AS
  93. DECLARE variable existe BOOLEAN;
  94. BEGIN
  95.   existe=FALSE;
  96.   IF (EXISTS(
  97.        SELECT * FROM rdb$relation_constraints
  98.        WHERE rdb$constraint_name='PK_CLIENTES' )) THEN
  99.     existe=TRUE;
  100.   IF (NOT existe) THEN
  101.   BEGIN
  102.     EXECUTE statement
  103.       '
  104.      ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (ID_CLIENTE);
  105.      ';
  106.   END
  107. END
  108. ^
  109.  
  110. COMMIT;^
  111.  
  112. -- Constraint status apenas A ou C
  113. EXECUTE block AS
  114. DECLARE variable existe BOOLEAN;
  115. BEGIN
  116.   existe=FALSE;
  117.   IF (EXISTS(
  118.        SELECT * FROM rdb$relation_constraints
  119.        WHERE rdb$constraint_name='CHK_CLIENTES_STATUS' )) THEN
  120.     existe=TRUE;
  121.   IF (existe) THEN
  122.   BEGIN
  123.     EXECUTE statement
  124.       '
  125.      ALTER TABLE CLIENTES
  126.        DROP CONSTRAINT CHK_CLIENTES_STATUS
  127.      ';
  128.   END
  129. END
  130. ^
  131.  
  132. COMMIT;^
  133.  
  134.  
  135. -- Constraint status apenas A ou C
  136. EXECUTE block AS
  137. DECLARE variable existe BOOLEAN;
  138. BEGIN
  139.   existe=FALSE;
  140.   IF (EXISTS(
  141.        SELECT * FROM rdb$relation_constraints
  142.        WHERE rdb$constraint_name='CHK_CLIENTES_STATUS'
  143.        )) THEN
  144.     existe=TRUE;
  145.   IF (NOT existe) THEN
  146.   BEGIN
  147.     EXECUTE statement
  148.       '
  149.        ALTER TABLE CLIENTES
  150.        ADD CONSTRAINT CHK_CLIENTES_STATUS
  151.        CHECK (
  152.        STATUS IN (''A'',''C'',''P'')
  153.        );
  154.      ';
  155.   END
  156. END
  157. ^
  158.  
  159. COMMIT;^
  160.  
  161. -- Adicionando campo CNPJ
  162. EXECUTE block AS
  163. DECLARE variable existe BOOLEAN;
  164. BEGIN
  165.   existe=FALSE;
  166.   IF (EXISTS(
  167.        SELECT * FROM rdb$relation_fields rf
  168.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='CNPJ'
  169.        )) THEN
  170.     existe=TRUE;
  171.   IF (NOT existe) THEN
  172.   BEGIN
  173.     EXECUTE statement
  174.       '
  175.        ALTER TABLE CLIENTES
  176.        ADD CNPJ CHAR(14)
  177.      ';
  178.   END
  179. END
  180. ^
  181.  
  182. COMMIT;^
  183.  
  184. -- CNPJ não pode ter nulos
  185. EXECUTE block AS
  186. DECLARE variable existe BOOLEAN;
  187. BEGIN
  188.   existe=FALSE;
  189.   IF (EXISTS(
  190.        SELECT * FROM rdb$relation_fields rf
  191.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='CNPJ'
  192.        )) THEN
  193.     existe=TRUE;
  194.   IF (existe) THEN
  195.   BEGIN
  196.     EXECUTE statement
  197.       '
  198.       UPDATE CLIENTES SET CNPJ='''' WHERE CNPJ IS NULL;
  199.      ';
  200.   END
  201. END
  202. ^
  203.  
  204. COMMIT;^
  205.  
  206. -- CNPJ não pode ter nulos not nulll
  207. EXECUTE block AS
  208. DECLARE variable existe BOOLEAN;
  209. BEGIN
  210.   existe=FALSE;
  211.   IF (EXISTS(
  212.        SELECT * FROM rdb$relation_fields rf
  213.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='CNPJ'
  214.        )) THEN
  215.     existe=TRUE;
  216.   IF (existe) THEN
  217.   BEGIN
  218.     EXECUTE statement
  219.       '
  220.      ALTER TABLE CLIENTES ALTER CNPJ SET NOT NULL
  221.      ';
  222.   END
  223. END
  224. ^
  225.  
  226. COMMIT;^
  227.  
  228. -- Adicionando campo LAST_UPDATE
  229. EXECUTE block AS
  230. DECLARE variable existe BOOLEAN;
  231. BEGIN
  232.   existe=FALSE;
  233.   IF (EXISTS(
  234.        SELECT * FROM rdb$relation_fields rf
  235.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='LAST_UPDATE'
  236.        )) THEN
  237.     existe=TRUE;
  238.   IF (NOT existe) THEN
  239.   BEGIN
  240.     EXECUTE statement
  241.       '
  242.        ALTER TABLE CLIENTES
  243.        ADD LAST_UPDATE timestamp
  244.        DEFAULT current_timestamp;
  245.      ';
  246.   END
  247. END
  248. ^
  249.  
  250. COMMIT;^
  251.  
  252. -- Adicionando campo LAST_UPDATE
  253. EXECUTE block AS
  254. DECLARE variable existe BOOLEAN;
  255. BEGIN
  256.   existe=FALSE;
  257.   IF (EXISTS(
  258.        SELECT * FROM rdb$relation_fields rf
  259.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='LAST_OWNER'
  260.        )) THEN
  261.     existe=TRUE;
  262.   IF (NOT existe) THEN
  263.   BEGIN
  264.     EXECUTE statement
  265.       '
  266.        ALTER TABLE CLIENTES
  267.          ADD LAST_OWNER varchar(60)
  268.          DEFAULT current_user;
  269.      ';
  270.   END
  271. END
  272. ^
  273.  
  274. COMMIT;^
  275.  
  276. -- Criando campo STATUS_COM (compute by) - FANTASIA
  277. EXECUTE block AS
  278. DECLARE variable existe BOOLEAN;
  279. BEGIN
  280.   existe=FALSE;
  281.   IF (EXISTS(
  282.        SELECT * FROM rdb$relation_fields rf
  283.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='STATUS_COM'
  284.        )) THEN
  285.     existe=TRUE;
  286.   IF (NOT existe) THEN
  287.   BEGIN
  288.     EXECUTE statement
  289.       '
  290.        ALTER TABLE CLIENTES
  291.          ADD STATUS_COM COMPUTED BY ((CAST(''*'' AS VARCHAR(15))))
  292.      ';
  293.   END
  294. END
  295. ^
  296.  
  297. COMMIT;^
  298.  
  299. -- Criando campo STATUS_COM (compute by) - REAL
  300. EXECUTE block AS
  301. DECLARE variable existe BOOLEAN;
  302. BEGIN
  303.   existe=FALSE;
  304.   IF (EXISTS(
  305.        SELECT * FROM rdb$relation_fields rf
  306.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='STATUS_COM'
  307.        )) THEN
  308.     existe=TRUE;
  309.   IF (existe) THEN
  310.   BEGIN
  311.     EXECUTE statement
  312.       '
  313.        ALTER TABLE CLIENTES
  314.          ALTER STATUS_COM COMPUTED BY (
  315.                  CAST(
  316.                    CASE
  317.                      WHEN STATUS=''A'' THEN ''Ativo''
  318.                      WHEN STATUS=''C'' THEN ''Cancelado''
  319.                      WHEN STATUS=''P'' THEN ''Pàralisado''
  320.                      ELSE ''Indefinido''
  321.                    END AS VARCHAR(15)
  322.                  )
  323.                )
  324.      ';
  325.   END
  326. END
  327.  
  328. ^
  329.  
  330. COMMIT;^
  331.  
  332. -- Criando campo STATUS_COM (compute by)  - FANTASIA
  333. EXECUTE block AS
  334. DECLARE variable existe BOOLEAN;
  335. BEGIN
  336.   existe=FALSE;
  337.   IF (EXISTS(
  338.        SELECT * FROM rdb$relation_fields rf
  339.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='MODIFICADO_COM'
  340.        )) THEN
  341.     existe=TRUE;
  342.   IF (NOT existe) THEN
  343.   BEGIN
  344.     EXECUTE statement
  345.       '
  346.        ALTER TABLE CLIENTES
  347.          ADD MODIFICADO_COM COMPUTED BY ((CAST(''*'' AS VARCHAR(40))))
  348.      ';
  349.   END
  350. END
  351. ^
  352.  
  353. COMMIT;^
  354.  
  355. -- Criando campo STATUS_COM (compute by)  - REAL
  356. EXECUTE block AS
  357. DECLARE variable existe BOOLEAN;
  358. BEGIN
  359.   existe=FALSE;
  360.   IF (EXISTS(
  361.        SELECT * FROM rdb$relation_fields rf
  362.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='MODIFICADO_COM'
  363.        )) THEN
  364.     existe=TRUE;
  365.   IF (existe) THEN
  366.   BEGIN
  367.     EXECUTE statement
  368.       '
  369.        ALTER TABLE CLIENTES ALTER MODIFICADO_COM COMPUTED BY (
  370.                  CAST(
  371.                    CASE
  372.                      WHEN (last_update<=''01.01.1970'') THEN ''Inalterado''
  373.                      WHEN (coalesce(last_owner,'''')='''') then left(cast(last_update as varchar(24))||'' anonimo'', 40)
  374.                      ELSE left(cast(last_update as varchar(24))||'' ''||last_owner, 40)
  375.                    END AS VARCHAR(40)
  376.                  )
  377.                )
  378.      ';
  379.   END
  380. END
  381. ^
  382.  
  383. COMMIT;^
  384.  
  385. -- Validando o campo CNPJ para receber indice unico
  386. EXECUTE block AS
  387. DECLARE variable existe BOOLEAN;
  388. BEGIN
  389.   existe=FALSE;
  390.   IF (EXISTS(
  391.        SELECT * FROM rdb$relation_fields rf
  392.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='CNPJ'
  393.        )) THEN
  394.     existe=TRUE;
  395.   IF (existe) THEN
  396.   BEGIN
  397.     existe=FALSE;
  398.     IF (EXISTS(
  399.         SELECT *
  400.         FROM clientes c
  401.         WHERE
  402.           (
  403.             (
  404.             SELECT COUNT(*) FROM clientes c2
  405.             WHERE c2.cnpj=c.cnpj
  406.             )>1
  407.           )
  408.          ) ) THEN
  409.       existe=TRUE;
  410.     IF (existe) THEN
  411.     BEGIN
  412.         EXECUTE statement
  413.           '
  414.            update clientes set
  415.              cnpj=cast(substring(nome_completo||''#'' similar ''%#"[[:DIGIT:]]+#"%'' escape ''#'') as varchar(14))
  416.            where coalesce(cnpj,'''')=''''
  417.          ';
  418.     END
  419.   END
  420. END
  421. ^
  422.  
  423. COMMIT;^
  424.  
  425. -- Criando um indice de campo unico CNPJ
  426. EXECUTE block AS
  427. DECLARE variable existe BOOLEAN;
  428. BEGIN
  429.   existe=FALSE;
  430.   IF (EXISTS(
  431.        SELECT * FROM rdb$relation_fields rf
  432.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='CNPJ'
  433.        )) THEN
  434.     existe=TRUE;
  435.   IF (existe) THEN
  436.   BEGIN
  437.     existe=FALSE;
  438.     IF (EXISTS(
  439.        SELECT * FROM rdb$relation_constraints
  440.        WHERE rdb$constraint_name='UNQ_CLIENTES_CNPJ'
  441.        )) THEN
  442.       existe=TRUE;
  443.     IF (NOT existe) THEN
  444.     BEGIN
  445.       EXECUTE statement
  446.         '
  447.          ALTER TABLE CLIENTES
  448.          ADD CONSTRAINT UNQ_CLIENTES_CNPJ
  449.          UNIQUE (CNPJ);
  450.        ';
  451.     END
  452.   END
  453. END
  454. ^
  455.  
  456. COMMIT;^
  457.  
  458. -- Criando um indice de campo NOME (não unico)
  459. EXECUTE block AS
  460. DECLARE variable existe BOOLEAN;
  461. BEGIN
  462.   existe=FALSE;
  463.   IF (EXISTS(
  464.        SELECT * FROM rdb$relation_fields rf
  465.        WHERE rf.rdb$relation_name='CLIENTES' AND rdb$field_name='NOME_COMPLETO'
  466.        )) THEN
  467.     existe=TRUE;
  468.   IF (existe) THEN
  469.   BEGIN
  470.     existe=FALSE;
  471.     rdb$indices WHERE rdb$index_name
  472.     IF (EXISTS(
  473.        SELECT * FROM rdb$indices
  474.         WHERE rdb$index_name ='IDX_CLIENTES_NOME_COMPLETO'
  475.        )) THEN
  476.       existe=TRUE;
  477.     IF (NOT existe) THEN
  478.     BEGIN
  479.       EXECUTE statement
  480.         '
  481.        CREATE INDEX IDX_CLIENTES_NOME_COMPLETO
  482.        ON CLIENTES (NOME_COMPLETO)
  483.        ';
  484.     END
  485.   END
  486. END
  487. ^
  488.  
  489. COMMIT; ^
  490.  
  491. SET TERM ; ^
Add Comment
Please, Sign In to add comment