Advertisement
Guest User

Untitled

a guest
Jul 15th, 2019
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.                             -- ################################################## --
  2.                             -- ##################### TABELAS #################### --
  3.                             -- ################################################## --
  4.  
  5.  
  6. CREATE TABLE ALUNO
  7. (  
  8.     COD_ALUNO INT NOT NULL PRIMARY KEY,
  9.     NOME VARCHAR(30) NOT NULL,
  10.     CPF VARCHAR(11),
  11.     DATA_NASCIMENTO DATE NOT NULL,
  12.     EMAIL VARCHAR(30) NOT NULL,
  13.     SENHA VARCHAR(30) NOT NULL,
  14.     SALDO FLOAT DEFAULT 0
  15. );
  16.  
  17. CREATE TABLE PROFESSOR
  18. (  
  19.     COD_PROFESSOR INT NOT NULL PRIMARY KEY,
  20.     NOME VARCHAR(30) NOT NULL,
  21.     CPF VARCHAR(11) NOT NULL,
  22.     DATA_NASCIMENTO DATE NOT NULL,
  23.     EMAIL VARCHAR(30) NOT NULL,
  24.     SENHA VARCHAR(30) NOT NULL,
  25.     SALDO FLOAT DEFAULT 0,
  26.     DATA_ULTIMO_PAGAMENTO DATE DEFAULT NULL
  27. );
  28.  
  29. CREATE TABLE CURSO
  30. (  
  31.     COD_CURSO INT NOT NULL PRIMARY KEY,
  32.     NOME VARCHAR(60) NOT NULL,
  33.     DESCRICAO VARCHAR(300),
  34.     DURACAO INT DEFAULT 0,
  35.     PRECO FLOAT,
  36.     NUMERO_MODULOS INT DEFAULT 0,
  37.     PUBLICADO BOOLEAN DEFAULT FALSE,
  38.     DISPONIBILIDADE BOOLEAN DEFAULT FALSE,
  39.     COD_PROFESSOR INT NOT NULL REFERENCES PROFESSOR(COD_PROFESSOR) ON DELETE CASCADE
  40. );
  41.  
  42. CREATE TABLE ALUNO_CURSO
  43. (  
  44.     COD_ALUNO_CURSO SERIAL NOT NULL PRIMARY KEY,
  45.     DATA_COMPRA DATE,
  46.     NOTA_AVALIACAO FLOAT,
  47.     COD_ALUNO INT NOT NULL REFERENCES ALUNO(COD_ALUNO) ON DELETE CASCADE,
  48.     COD_CURSO INT NOT NULL REFERENCES CURSO(COD_CURSO) ON DELETE CASCADE
  49. );
  50.  
  51. CREATE TABLE MODULO
  52. (  
  53.     COD_MODULO SERIAL NOT NULL PRIMARY KEY,
  54.     NOME VARCHAR(100),
  55.     DESCRICAO VARCHAR(300),
  56.     DURACAO INT,
  57.     COD_CURSO INT NOT NULL REFERENCES CURSO(COD_CURSO) ON DELETE CASCADE
  58. );
  59.  
  60. CREATE TABLE ALUNO_MODULO
  61. (
  62.     COD_ALUNO_MODULO SERIAL NOT NULL PRIMARY KEY,
  63.     ACESSIVEL BOOLEAN,
  64.     META_CONCLUIDA BOOLEAN,
  65.     COD_ALUNO INT NOT NULL REFERENCES ALUNO(COD_ALUNO) ON DELETE CASCADE,
  66.     COD_MODULO INT NOT NULL REFERENCES MODULO(COD_MODULO) ON DELETE CASCADE
  67. );
  68.  
  69. CREATE TABLE PRE_REQUISITO
  70. (  
  71.     COD_PRE_REQUESITO SERIAL NOT NULL PRIMARY KEY,
  72.     COD_MODULO INT NOT NULL REFERENCES MODULO(COD_MODULO) ON DELETE CASCADE,
  73.     COD_MODULO_PRE_REQUISITO INT NOT NULL REFERENCES MODULO(COD_MODULO) ON DELETE CASCADE
  74. );
  75.  
  76. CREATE TABLE DISCIPLINA
  77. (  
  78.     COD_DISCIPLINA SERIAL NOT NULL PRIMARY KEY,
  79.     NOME VARCHAR(100),
  80.     DESCRICAO VARCHAR(300),
  81.     COD_MODULO INT NOT NULL REFERENCES MODULO(COD_MODULO) ON DELETE CASCADE
  82. );
  83.  
  84. CREATE TABLE VIDEO_AULA
  85. (  
  86.     COD_VIDEO_AULA SERIAL PRIMARY KEY,
  87.     NOME VARCHAR(30) NOT NULL,
  88.     DESCRICAO VARCHAR(300),
  89.     DURACAO FLOAT,
  90.     COD_DISCIPLINA INT NOT NULL REFERENCES DISCIPLINA(COD_DISCIPLINA) ON DELETE CASCADE
  91. );
  92.  
  93. CREATE TABLE ALUNO_VIDEOS_ASSISTIDOS
  94. (  
  95.     COD_ALUNO_VIDEO_ASSISTIDO SERIAL NOT NULL PRIMARY KEY,
  96.     COD_ALUNO INT NOT NULL REFERENCES ALUNO(COD_ALUNO) ON DELETE CASCADE,
  97.     COD_VIDEO_AULA INT NOT NULL REFERENCES VIDEO_AULA(COD_VIDEO_AULA) ON DELETE CASCADE
  98. );
  99.  
  100. CREATE TABLE QUESTAO
  101. (  
  102.     COD_QUESTAO SERIAL NOT NULL PRIMARY KEY,
  103.     TEXTO VARCHAR(500),
  104.     COD_DISCIPLINA INT NOT NULL REFERENCES DISCIPLINA(COD_DISCIPLINA) ON DELETE CASCADE
  105. );
  106.  
  107. CREATE TABLE QUESTIONARIO
  108. (  
  109.     COD_QUESTIONARIO SERIAL NOT NULL PRIMARY KEY,
  110.     NOME VARCHAR(30),
  111.     COD_DISCIPLINA INT NOT NULL REFERENCES DISCIPLINA(COD_DISCIPLINA) ON DELETE CASCADE
  112. );
  113.  
  114. CREATE TABLE QUESTAO_QUESTIONARIO
  115. (  
  116.     COD_QUESTAO_QUESTIONARIO SERIAL NOT NULL PRIMARY KEY,
  117.     COD_QUESTAO INT NOT NULL REFERENCES QUESTAO(COD_QUESTAO) ON DELETE CASCADE,
  118.     COD_QUESTIONARIO INT NOT NULL REFERENCES QUESTIONARIO(COD_QUESTIONARIO) ON DELETE CASCADE
  119. );
  120.  
  121. CREATE TABLE QUESTAO_ALUNO
  122. (  
  123.     COD_QUESTAO_ALUNO SERIAL NOT NULL PRIMARY KEY,
  124.     RESPOSTAR_ALUNO VARCHAR(500),
  125.     RESPOSTA_CORRETA VARCHAR(13) DEFAULT 'NÃO ANALISADA',
  126.     COD_QUESTAO INT NOT NULL REFERENCES QUESTAO(COD_QUESTAO),
  127.     COD_ALUNO INT NOT NULL REFERENCES ALUNO(COD_ALUNO)
  128. );
  129.  
  130.  
  131. --------------------------------------------------------------------------------------------------------------------------------
  132.                             -- ################################################## --
  133.                             -- ############ FUNCTIONS INSERT USUARIO ############ --
  134.                             -- ################################################## --
  135.                            
  136. /* CRIANDO FUNCTION INSERIR ALUNO E PROFESSOR */
  137. CREATE OR REPLACE FUNCTION INSERIR_ALUNO_E_PROFESSOR(COD_USUARIO INT,
  138. NOME TEXT, CPF TEXT, DATA_NASCIMENTO DATE, EMAIL TEXT, SENHA TEXT, TABELA TEXT)
  139. RETURNS VOID
  140. AS $$
  141. BEGIN
  142.     IF TABELA = 'ALUNO' THEN
  143.         INSERT INTO ALUNO VALUES (COD_USUARIO, NOME, CPF, DATA_NASCIMENTO, EMAIL, SENHA, DEFAULT);
  144.     END IF;
  145.  
  146.     IF TABELA = 'PROFESSOR' THEN
  147.         INSERT INTO PROFESSOR VALUES (COD_USUARIO, NOME, CPF, DATA_NASCIMENTO, EMAIL, SENHA, DEFAULT, DEFAULT);
  148.     END IF;
  149. END
  150. $$ LANGUAGE plpgsql;
  151.  
  152. /* RETORNA IDADE */
  153. CREATE OR REPLACE FUNCTION RETORNA_IDADE(DATA_NASCIMENTO DATE)
  154. RETURNS INT
  155. AS $$
  156. BEGIN
  157.     RETURN EXTRACT(YEAR FROM AGE(DATA_NASCIMENTO));
  158. END
  159. $$ LANGUAGE plpgsql;
  160.  
  161.  
  162. /* USUARIO EXISTENTE NO BD DEPENDENDO DA TABELA */
  163. CREATE OR REPLACE FUNCTION USUARIO_EXISTENTE(CPF_USUARIO TEXT, TABELA TEXT)
  164. RETURNS TABLE (CPF VARCHAR(11))
  165. AS $$
  166. BEGIN
  167.     IF TABELA = 'ALUNO' THEN
  168.         RETURN QUERY SELECT A_L.CPF FROM ALUNO A_L WHERE A_L.CPF = CPF_USUARIO;
  169.     END IF;
  170.    
  171.     IF TABELA = 'PROFESSOR' THEN
  172.         RETURN QUERY SELECT P_F.CPF FROM PROFESSOR P_F WHERE P_F.CPF = CPF_USUARIO;
  173.     END IF;
  174. END
  175. $$ LANGUAGE plpgsql;
  176.  
  177. /* EMAIL EXISTENTE NO BD DEPENDENDO DA TABELA */
  178. CREATE OR REPLACE FUNCTION EMAIL_USUARIO_EXISTENTE(EMAIL_USUARIO TEXT, TABELA TEXT)
  179. RETURNS TABLE (EMAIL VARCHAR(30))
  180. AS $$
  181. BEGIN
  182.     IF TABELA = 'ALUNO' THEN
  183.         RETURN QUERY SELECT A_L.EMAIL FROM ALUNO A_L WHERE A_L.EMAIL = EMAIL_USUARIO;
  184.     END IF;
  185.    
  186.     IF TABELA = 'PROFESSOR' THEN
  187.         RETURN QUERY SELECT P_F.EMAIL FROM PROFESSOR P_F WHERE P_F.EMAIL = EMAIL_USUARIO;
  188.     END IF;
  189. END
  190. $$ LANGUAGE plpgsql;
  191.  
  192. --------------------------------------------------------------------------------------------------------------------------------
  193.                             -- ################################################## --
  194.                             -- ############ TRIGGER INSERT USUARIOS ############# --
  195.                             -- ################################################## --
  196.                            
  197. /* FUNCTION REGRA DE NEGOCIO DA INSERÇÃO */
  198. CREATE OR REPLACE FUNCTION VERIFICA_INSERCAO()
  199. RETURNS TRIGGER
  200. AS $$
  201. DECLARE
  202.     IDADE INT := RETORNA_IDADE(NEW.DATA_NASCIMENTO);
  203.     CPF_ALUNO_EXISTENTE TEXT := USUARIO_EXISTENTE(NEW.CPF, 'ALUNO');
  204.     EMAIL_ALUNO_EXISTENTE TEXT := EMAIL_USUARIO_EXISTENTE(NEW.EMAIL, 'ALUNO');
  205.     CPF_PROFESSOR_EXISTENTE TEXT := USUARIO_EXISTENTE(NEW.CPF, 'PROFESSOR');
  206.     EMAIL_PROFESSOR_EXISTENTE TEXT := EMAIL_USUARIO_EXISTENTE(NEW.EMAIL, 'PROFESSOR');
  207. BEGIN
  208.    
  209.     IF IDADE < 18 THEN
  210.         RAISE EXCEPTION 'VOCÊ É MENOR DE IDADE CADASTRO REJEITADO!';
  211.  
  212.     ELSIF NEW.CPF = CPF_ALUNO_EXISTENTE THEN
  213.         RAISE EXCEPTION 'JÁ EXISTE UM ALUNO CADASTRADO COM ESSE CPF, INSIRA UM CPF VALIDO.';
  214.    
  215.     ELSIF NEW.EMAIL = EMAIL_ALUNO_EXISTENTE THEN
  216.         RAISE EXCEPTION 'ESSE EMAIL JÁ CONSTA EM UM CADASTRO ALUNO, INSIRA UM EMAIL VALIDO.';
  217.    
  218.     ELSIF NEW.CPF = CPF_PROFESSOR_EXISTENTE THEN
  219.         RAISE EXCEPTION 'JÁ EXISTE UM PROFESSOR CADASTRADO COM ESSE CPF, INSIRA UM CPF VALIDO.';
  220.    
  221.     ELSIF NEW.EMAIL = EMAIL_PROFESSOR_EXISTENTE THEN
  222.         RAISE EXCEPTION 'ESSE EMAIL JÁ CONSTA EM UM CADASTRO PROFESSOR, INSIRA UM EMAIL VALIDO.';
  223.     END IF;
  224.    
  225.     RETURN NEW;
  226. END
  227. $$ LANGUAGE plpgsql;
  228.  
  229. /* TREGGES INSERT ALUNO */
  230. CREATE TRIGGER EVENTOS_DE_INSERCAO_ALUNO
  231. BEFORE INSERT ON ALUNO
  232. FOR EACH ROW
  233. EXECUTE PROCEDURE VERIFICA_INSERCAO();
  234.  
  235. /* TREGGES INSERT PROFESSOR */
  236. CREATE TRIGGER EVENTOS_DE_INSERCAO_PROFESSOR
  237. BEFORE INSERT ON PROFESSOR
  238. FOR EACH ROW
  239. EXECUTE PROCEDURE VERIFICA_INSERCAO();
  240.                            
  241. -----------------------------------------------------------------------------------------------------------------------------
  242.  
  243.                             -- ################################################## --
  244.                             -- #################### FUNCTIONS ################### --
  245.                             -- ################################################## --
  246.  
  247. --------------------------------------------------------------------------------------------------------------------------------
  248.  
  249. /* RETORNA COD_PROFESSOR */
  250. CREATE OR REPLACE FUNCTION RETORNA_COD_PROFESSOR(CPF_PROFESSOR TEXT)
  251. RETURNS TABLE (PROFESSOR_CODIGO INT)
  252. AS $$
  253. BEGIN
  254.     RETURN QUERY SELECT COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR;
  255. END
  256. $$ LANGUAGE plpgsql;
  257.  
  258. --------------------------------------------------------------------------------------------------------------------------------
  259.  
  260. /* CURSO EXISTENTE */
  261. CREATE OR REPLACE FUNCTION CURSO_EXISTE(CODIGO_CURSO INT)
  262. RETURNS INT
  263. AS $$
  264. DECLARE
  265.     CURSO_EXISTE INT;
  266. BEGIN
  267.     SELECT C_R.COD_CURSO INTO CURSO_EXISTE FROM CURSO C_R WHERE C_R.COD_CURSO = CODIGO_CURSO;
  268.    
  269.     IF CURSO_EXISTE IS NOT NULL THEN
  270.         RETURN CURSO_EXISTE;
  271.        
  272.     ELSE
  273.         RAISE EXCEPTION 'ESSE CURSO NÃO EXISTE! INFORME O CODIGO DE UM CURSO EXISTENTE...';
  274.     END IF;
  275. END
  276. $$ LANGUAGE plpgsql;
  277.  
  278. --------------------------------------------------------------------------------------------------------------------------------
  279.  
  280. /* MODULO EXISTENTE */
  281. CREATE OR REPLACE FUNCTION MODULO_EXISTE(CODIGO_MODULO INT)
  282. RETURNS INT
  283. AS $$
  284. DECLARE
  285.     MODULO_EXISTE INT := (SELECT C_S.COD_CURSO FROM CURSO C_S INNER JOIN MODULO M_D ON
  286.     C_S.COD_CURSO = M_D.COD_CURSO WHERE M_D.COD_MODULO = CODIGO_MODULO);
  287. BEGIN
  288.  
  289.     IF MODULO_EXISTE IS NOT NULL THEN
  290.         RETURN MODULO_EXISTE;
  291.     ELSE
  292.         RAISE EXCEPTION 'ESSE MODULO NÃO EXISTE PARA ESSE CURSO! INFORME O CODIGO DE UM MODULO EXISTENTE...';
  293.     END IF;
  294.    
  295. END
  296. $$ LANGUAGE plpgsql;
  297.  
  298. --------------------------------------------------------------------------------------------------------------------------------
  299.  
  300. /* DISCIPLINA EXISTENTE */
  301. CREATE OR REPLACE FUNCTION DISCIPLINA_EXISTENTE(CODIGO_DISCIPLINA INT)
  302. RETURNS INT
  303. AS $$
  304. DECLARE
  305.     DISCIPLINA_EXISTE INT := (SELECT D_C.COD_DISCIPLINA FROM DISCIPLINA D_C WHERE D_C.COD_DISCIPLINA = CODIGO_DISCIPLINA);
  306. BEGIN
  307.     IF DISCIPLINA_EXISTE IS NOT NULL THEN
  308.         RETURN DISCIPLINA_EXISTE;
  309.     ELSE
  310.         RAISE EXCEPTION 'ESSA DISCIPLINA NÃO EXISTE! INFORME O CODIGO DE UMA DISCIPLINA EXISTENTE...';
  311.     END IF;
  312. END
  313. $$ LANGUAGE plpgsql;
  314.  
  315. --------------------------------------------------------------------------------------------------------------------------------
  316. /* DELETANDO VIDEO */
  317. CREATE OR REPLACE FUNCTION DELETAR_VIDEO(CPF_PROFESSOR TEXT, CODIGO_VIDEO_AULA INT)
  318. RETURNS VOID
  319. AS $$
  320. DECLARE
  321.     VIDEO_EXISTE INT := (SELECT C_S.COD_CURSO FROM CURSO C_S INNER JOIN MODULO M_D ON
  322.     C_S.COD_CURSO = M_D.COD_CURSO INNER JOIN DISCIPLINA D_S ON
  323.     M_D.COD_MODULO = D_S.COD_MODULO INNER JOIN VIDEO_AULA V_A ON
  324.     D_S.COD_DISCIPLINA = V_A.COD_DISCIPLINA WHERE V_A.COD_VIDEO_AULA = CODIGO_VIDEO_AULA);
  325.     CODIGO_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  326.     CURSO_PERTENCE_PROF INT := (SELECT C_R.COD_CURSO FROM CURSO C_R WHERE C_R.COD_PROFESSOR = CODIGO_PROFESSOR AND
  327.     C_R.COD_CURSO = VIDEO_EXISTE);
  328. BEGIN
  329.    
  330.     IF CODIGO_PROFESSOR IS NOT NULL THEN
  331.         IF CURSO_PERTENCE_PROF IS NOT NULL THEN
  332.             IF VIDEO_EXISTE IS NOT NULL THEN
  333.                 DELETE FROM VIDEO_AULA V_A WHERE V_A.COD_VIDEO_AULA = CODIGO_VIDEO_AULA;
  334.             ELSE
  335.                 RAISE EXCEPTION 'ESSE VIDEO NÃO EXISTE, INSIRA UM COD_VIDEO_AULA VALIDO!';
  336.             END IF;
  337.         ELSE
  338.             RAISE EXCEPTION 'ESSE CURSO NÃO PERCENTE A ESSE PROFESSOR!';
  339.         END IF;
  340.     ELSE
  341.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, INSIRA UM CPF VALIDO!';
  342.     END IF;
  343.  
  344. END
  345. $$ LANGUAGE plpgsql;
  346.  
  347. --------------------------------------------------------------------------------------------------------------------------------
  348. --- ############################################## DELETAR_DISCIPLINA ###################################################### ---
  349. --------------------------------------------------------------------------------------------------------------------------------
  350. /* DELETANDO DISCIPLINA */
  351. CREATE OR REPLACE FUNCTION DELETAR_DISCIPLINA(CPF_PROFESSOR TEXT, CODIGO_DISCIPLINA INT)
  352. RETURNS VOID
  353. AS $$
  354. DECLARE
  355.     DISCIPLINA_EXISTENTE INT = (SELECT C_S.COD_CURSO FROM CURSO C_S INNER JOIN MODULO M_D ON
  356.     C_S.COD_CURSO = M_D.COD_CURSO INNER JOIN DISCIPLINA D_S ON
  357.     M_D.COD_MODULO = D_S.COD_MODULO WHERE D_S.COD_DISCIPLINA = CODIGO_DISCIPLINA);
  358.     CODIGO_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  359.     CURSO_PERTENCE_PROF INT := (SELECT C_R.COD_CURSO FROM CURSO C_R WHERE C_R.COD_PROFESSOR =
  360.     CODIGO_PROFESSOR AND C_R.COD_CURSO = DISCIPLINA_EXISTENTE );
  361. BEGIN
  362.    
  363.     IF CODIGO_PROFESSOR IS NOT NULL THEN
  364.         IF CURSO_PERTENCE_PROF IS NOT NULL THEN
  365.             IF DISCIPLINA_EXISTENTE IS NOT NULL THEN
  366.                 DELETE FROM DISCIPLINA D_C WHERE D_C.COD_DISCIPLINA = CODIGO_DISCIPLINA;
  367.             ELSE
  368.                 RAISE EXCEPTION 'ESSA DISCIPLINA NÃO EXISTE, INSIRA UM COD_DISCIPLINA VALIDO!';
  369.             END IF;
  370.         ELSE
  371.             RAISE EXCEPTION 'ESSE CURSO NÃO PERCENTE A ESSE PROFESSOR!';
  372.         END IF;
  373.     ELSE
  374.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, INSIRA UM CPF VALIDO!';
  375.     END IF;
  376.    
  377. END
  378. $$ LANGUAGE plpgsql;
  379.  
  380. --------------------------------------------------------------------------------------------------------------------------------
  381. --- ################################################ DELETAR_MODULO ######################################################## ---
  382. --------------------------------------------------------------------------------------------------------------------------------
  383. /* DELETANDO MODULO */
  384. CREATE OR REPLACE FUNCTION DELETAR_MODULO(CPF_PROFESSOR TEXT, CODIGO_MODULO INT)
  385. RETURNS VOID
  386. AS $$
  387. DECLARE
  388.     MODULO_EXISTE INT := (SELECT C_S.COD_CURSO FROM CURSO C_S INNER JOIN MODULO M_D ON
  389.     C_S.COD_CURSO = M_D.COD_CURSO WHERE M_D.COD_MODULO = CODIGO_MODULO);
  390.     CODIGO_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  391.     CURSO_PERTENCE_PROF INT := (SELECT C_R.COD_CURSO FROM CURSO C_R WHERE C_R.COD_PROFESSOR =
  392.     CODIGO_PROFESSOR AND C_R.COD_CURSO = MODULO_EXISTE );
  393. BEGIN
  394.    
  395.     IF CODIGO_PROFESSOR IS NOT NULL THEN
  396.         IF CURSO_PERTENCE_PROF IS NOT NULL THEN
  397.             IF MODULO_EXISTE IS NOT NULL THEN
  398.                 DELETE FROM MODULO M_D WHERE M_D.COD_MODULO = CODIGO_MODULO;
  399.             ELSE
  400.                 RAISE EXCEPTION 'ESSE MODULO NÃO EXISTE, INSIRA UM COD_MODULO VALIDO!';
  401.             END IF;
  402.         ELSE
  403.             RAISE EXCEPTION 'ESSE CURSO NÃO PERCENTE A ESSE PROFESSOR!';
  404.         END IF;
  405.     ELSE
  406.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, INSIRA UM CPF VALIDO!';
  407.     END IF;
  408.    
  409. END
  410. $$ LANGUAGE plpgsql;
  411.  
  412. --------------------------------------------------------------------------------------------------------------------------------
  413. --- ############################################# ADICIONAR_VIDEO_AULA ##################################################### ---
  414. --------------------------------------------------------------------------------------------------------------------------------
  415. /* ADICIONANDO VIDEO AULAS AS DISCIPLINAS  */
  416.  
  417. CREATE OR REPLACE FUNCTION ADICIONAR_VIDEO_AULA(CPF_PROFESSOR TEXT,
  418. CODIGO_DISCIPLINA INT, TITULO_VIDEO TEXT[], DESCRICAO TEXT[], DURACAO INT[])
  419. RETURNS VOID
  420. AS $$
  421. DECLARE
  422.     CODIGO_CURSO INT := (SELECT M_D.COD_CURSO FROM CURSO C_R INNER JOIN MODULO M_D ON
  423.     C_R.COD_CURSO = M_D.COD_CURSO INNER JOIN DISCIPLINA D_C ON
  424.     M_D.COD_MODULO = D_C.COD_MODULO WHERE D_C.COD_DISCIPLINA = CODIGO_DISCIPLINA);
  425.     DISCIPLINA_EXISTENTE INT = DISCIPLINA_EXISTENTE(CODIGO_DISCIPLINA);
  426.     CODIGO_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  427.     CURSO_PERTENCE_PROF INT := (SELECT C_R.COD_CURSO FROM CURSO C_R WHERE C_R.COD_PROFESSOR = CODIGO_PROFESSOR AND
  428.     C_R.COD_CURSO = CODIGO_CURSO);
  429.     CONTADOR INT := 1;
  430. BEGIN
  431.    
  432.     IF CODIGO_PROFESSOR IS NOT NULL THEN
  433.         IF CURSO_PERTENCE_PROF IS NOT NULL THEN
  434.             IF DISCIPLINA_EXISTENTE IS NOT NULL THEN
  435.                 WHILE CONTADOR <= ARRAY_LENGTH(TITULO_VIDEO,1) LOOP
  436.                     INSERT INTO VIDEO_AULA VALUES (DEFAULT, TITULO_VIDEO[CONTADOR], DESCRICAO[CONTADOR], DURACAO[CONTADOR],
  437.                     CODIGO_DISCIPLINA);
  438.                     CONTADOR := CONTADOR + 1;
  439.                 END LOOP;
  440.             END IF;
  441.         ELSE
  442.             RAISE EXCEPTION 'ESSE CURSO NÃO PERCENTE A ESSE PROFESSOR!';
  443.         END IF;
  444.     ELSE
  445.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, INSIRA UM CPF VALIDO!';
  446.     END IF;
  447. END
  448. $$ LANGUAGE plpgsql;
  449.  
  450.  
  451. --------------------------------------------------------------------------------------------------------------------------------
  452. --- ############################################### CRIAR_DISCIPLINAS ###################################################### ---
  453. --------------------------------------------------------------------------------------------------------------------------------
  454. /* CRIANDO UMA DISCIPLINAS PARA ALGUM MODULO */
  455. CREATE OR REPLACE FUNCTION CRIAR_DISCIPLINAS(CPF_PROFESSOR TEXT,
  456. CODIGO_MODULO INT, NOME_DISCIPLINA TEXT[], DESCRICAO_DISCIPLINA TEXT[])
  457. RETURNS VOID
  458. AS $$
  459. DECLARE
  460.     CODIGO_CURSO INT := (SELECT C_S.COD_CURSO FROM CURSO C_S INNER JOIN MODULO M_D ON
  461.     C_S.COD_CURSO = M_D.COD_CURSO WHERE M_D.COD_MODULO = CODIGO_MODULO);
  462.     MODULO_EXISTENTE INT := MODULO_EXISTE(CODIGO_MODULO);
  463.     CODIGO_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  464.     CURSO_PERTENCE_PROF INT := (SELECT C_R.COD_CURSO FROM CURSO C_R WHERE C_R.COD_PROFESSOR = CODIGO_PROFESSOR AND C_R.COD_CURSO = CODIGO_CURSO);
  465.     CONTADOR INT := 1;
  466. BEGIN
  467.    
  468.     IF CODIGO_PROFESSOR IS NOT NULL THEN
  469.         IF CURSO_PERTENCE_PROF IS NOT NULL THEN
  470.             IF MODULO_EXISTENTE IS NOT NULL THEN
  471.                 WHILE CONTADOR <= ARRAY_LENGTH(NOME_DISCIPLINA,1) LOOP
  472.                     INSERT INTO DISCIPLINA VALUES (DEFAULT, NOME_DISCIPLINA[CONTADOR], DESCRICAO_DISCIPLINA[CONTADOR],
  473.                     CODIGO_MODULO);
  474.                     CONTADOR := CONTADOR + 1;
  475.                 END LOOP;
  476.             END IF;
  477.         ELSE
  478.             RAISE EXCEPTION 'ESSE CURSO NÃO PERCENTE A ESSE PROFESSOR!';
  479.         END IF;
  480.     ELSE
  481.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, INSIRA UM CPF VALIDO!';
  482.     END IF;
  483. END
  484. $$ LANGUAGE plpgsql;
  485.  
  486. -----------------------------------------------------------------------------------------------------------------------------
  487.                         -- ############################################################### --
  488.                         -- ##################### TRIGGER ALUNO_MODULO #################### --
  489.                         -- ############################################################### --
  490.                        
  491.  
  492. CREATE OR REPLACE FUNCTION STATUS_ALUNO_MODULO(CODIGO_ALUNO INT, CODIGO_CURSO INT)
  493. RETURNS VOID
  494. AS $$
  495. DECLARE
  496.     REGISTRO_COD_MODULO RECORD;
  497.     CONTADOR INT := 1;
  498. BEGIN
  499.    
  500.     FOR REGISTRO_COD_MODULO IN (SELECT * FROM CURSO C_S INNER JOIN MODULO M_D ON C_S.COD_CURSO = M_D.COD_CURSO WHERE M_D.COD_CURSO = CODIGO_CURSO) LOOP
  501.         IF CONTADOR = 1 THEN
  502.             INSERT INTO ALUNO_MODULO VALUES (DEFAULT, TRUE, FALSE, CODIGO_ALUNO, REGISTRO_COD_MODULO.COD_MODULO);
  503.             CONTADOR := CONTADOR + 1;
  504.         ELSE
  505.             INSERT INTO ALUNO_MODULO VALUES (DEFAULT, FALSE, FALSE, CODIGO_ALUNO, REGISTRO_COD_MODULO.COD_MODULO);
  506.         END IF;
  507.     END LOOP;
  508.    
  509. END
  510. $$ LANGUAGE plpgsql;
  511.  
  512. CREATE OR REPLACE FUNCTION EVENTOS_ALUNO_CURSO()
  513. RETURNS TRIGGER
  514. AS $$
  515. BEGIN
  516.    
  517.     IF TG_OP = 'INSERT' THEN
  518.         PERFORM STATUS_ALUNO_MODULO(NEW.COD_ALUNO, NEW.COD_CURSO);
  519.     END IF;
  520.    
  521.     RETURN NEW;
  522.  
  523. END
  524. $$ LANGUAGE plpgsql;
  525.  
  526. CREATE TRIGGER EVENTO_ALUNO_CURSO
  527. AFTER INSERT OR UPDATE ON ALUNO_CURSO
  528. FOR EACH ROW
  529. EXECUTE PROCEDURE EVENTOS_ALUNO_CURSO();
  530.  
  531. /* UPDATE QUANDO FOR SATISFEITO A MEDIA DE VIDEOS ASSISTIDOS PELO MODULO PARA ALTERAR O BOOLEAN
  532. META_CONCLUIDA */
  533.  
  534. --------------------------------------------------------------------------------------------------------------------------------
  535. --- ################################################# CRIAR_MODULO ######################################################### ---
  536. --------------------------------------------------------------------------------------------------------------------------------  
  537. /* CRIAR MODULOS */
  538. CREATE OR REPLACE FUNCTION CRIAR_MODULO(CPF_PROFESSOR TEXT,
  539. CODIGO_CURSO INT, NOME_MODULO TEXT[], DESCRICAO_MODULO TEXT[], DURACAO_MODULO INT[])
  540. RETURNS VOID
  541. AS $$
  542. DECLARE
  543.     CURSO_EXISTE INT := CURSO_EXISTE(CODIGO_CURSO);
  544.     CODIGO_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  545.     CURSO_PERTENCE_PROF INT := (SELECT C_R.COD_CURSO FROM CURSO C_R WHERE C_R.COD_PROFESSOR = CODIGO_PROFESSOR AND C_R.COD_CURSO = CODIGO_CURSO);
  546.     CONTADOR INT := 1;
  547. BEGIN
  548.     IF CODIGO_PROFESSOR IS NOT NULL THEN
  549.         IF CURSO_EXISTE IS NOT NULL THEN
  550.             IF CURSO_PERTENCE_PROF IS NOT NULL THEN
  551.                 WHILE CONTADOR <= ARRAY_LENGTH(NOME_MODULO,1) LOOP
  552.                     INSERT INTO MODULO VALUES (DEFAULT, NOME_MODULO[CONTADOR],
  553.                     DESCRICAO_MODULO[CONTADOR], DURACAO_MODULO[CONTADOR], CODIGO_CURSO);
  554.                     CONTADOR := CONTADOR + 1;
  555.                 END LOOP;
  556.             ELSE
  557.                 RAISE EXCEPTION 'ESSE CURSO NÃO PERCENTE A ESSE PROFESSOR!';
  558.             END IF;
  559.         ELSE
  560.             RAISE EXCEPTION 'ESSE CURSO NÃO EXISTE, DIGITE UM COD_CURSO VALIDO!';
  561.         END IF;
  562.     ELSE
  563.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, INSIRA UM CPF VALIDO!';
  564.     END IF;
  565. END
  566. $$ LANGUAGE plpgsql;
  567.  
  568. -------------------------------------------------------------------------------------------------------------------------------
  569. --- ################################################# CRIAR_CURSO ######################################################### ---
  570. --------------------------------------------------------------------------------------------------------------------------------  
  571. /* CRIAR CURSO */
  572. CREATE OR REPLACE FUNCTION CRIAR_CURSO(CPF_PROFESSOR TEXT, COD_CURSO INT, NOME_CURSO TEXT,
  573. DESCRICAO TEXT, PRECO FLOAT)
  574. RETURNS VOID
  575. AS $$
  576. DECLARE
  577.     COD_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  578. BEGIN
  579.    
  580.     IF COD_PROFESSOR IS NOT NULL THEN
  581.         INSERT INTO CURSO VALUES (COD_CURSO, NOME_CURSO, DESCRICAO, DEFAULT,
  582.         PRECO, DEFAULT, DEFAULT, DEFAULT, COD_PROFESSOR);
  583.     ELSE
  584.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, CPF INVALIDO!';
  585.     END IF;
  586. END
  587. $$ LANGUAGE plpgsql;
  588.  
  589. --------------------------------------------------------------------------------------------------------------------------------
  590. --- ################################################ PUBLICAR_CURSO ######################################################## ---
  591. --------------------------------------------------------------------------------------------------------------------------------
  592. /* PUBLICAR CURSO */
  593. CREATE OR REPLACE FUNCTION PUBLICAR_CURSO(CPF_PROFESSOR TEXT, CODIGO_CURSO INT)
  594. RETURNS VOID
  595. AS $$
  596. DECLARE
  597.     COD_PROFESSOR INT := (SELECT P_F.COD_PROFESSOR FROM PROFESSOR P_F WHERE P_F.CPF = CPF_PROFESSOR);
  598.     CURSO_EXISTE INT := CURSO_EXISTE(CODIGO_CURSO);
  599.     DISPONIBILIDADE BOOLEAN := (SELECT C_S.DISPONIBILIDADE FROM CURSO C_S WHERE C_S.COD_CURSO = CODIGO_CURSO);
  600. BEGIN
  601.  
  602.     IF COD_PROFESSOR IS NOT NULL THEN
  603.         IF CURSO_EXISTE IS NOT NULL THEN
  604.             IF DISPONIBILIDADE = TRUE THEN
  605.                 UPDATE CURSO SET PUBLICADO = TRUE WHERE COD_CURSO = CODIGO_CURSO;
  606.             ELSE
  607.                 RAISE EXCEPTION 'O CURSO NÃO ATENDE OS REQUESITOS NO MOMENTO PARA SER PUBLICADO, ATENDA OS REQUESITOS';
  608.             END IF;
  609.         ELSE
  610.             RAISE EXCEPTION 'ESSE CURSO NÃO EXISTE, DIGITE UM COD_CURSO VALIDO!';
  611.         END IF;
  612.     ELSE
  613.         RAISE EXCEPTION 'ESSE PROFESSOR NÃO EXISTE, CPF INVALIDO!';
  614.     END IF;
  615.    
  616. END
  617. $$ LANGUAGE plpgsql;
  618.  
  619. /* MODULO DISPONIVEL */
  620. CREATE OR REPLACE FUNCTION MODULO_STATUS_ALUNO(CODIGO_MODULO INT)
  621. RETURNS BOOLEAN
  622. AS $$
  623. DECLARE
  624.     STATUS BOOLEAN;
  625. BEGIN
  626.     SELECT M_D.STATUS INTO STATUS FROM MODULO M_D WHERE M_D.COD_MODULO = CODIGO_MODULO;
  627.     RETURN STATUS;
  628. END
  629. $$ LANGUAGE plpgsql;
  630.  
  631. ----------------------------------------------------------------------------------------------------------------------------------------------------------
  632.  
  633. /* ALUNO JÁ ASSITIU AO VIDEO */
  634.  
  635. CREATE OR REPLACE FUNCTION ALUNO_JA_ASSISTIU(CODIGO_VIDEO_AULA INT)
  636. RETURNS BOOLEAN
  637. AS $$
  638. DECLARE
  639.     REGISTRO_VIDEO RECORD;
  640. BEGIN
  641.    
  642.     FOR REGISTRO_VIDEO IN (SELECT * FROM ALUNO_VIDEOS_ASSISTIDOS) LOOP
  643.         IF REGISTRO_VIDEO.COD_VIDEO_AULA = CODIGO_VIDEO_AULA THEN
  644.             RETURN TRUE;
  645.         END IF;
  646.     END LOOP;
  647.     RETURN FALSE;
  648. END
  649. $$ LANGUAGE plpgsql;
  650.  
  651. /* ASSISTIR VIDEOS */
  652.  
  653. CREATE OR REPLACE FUNCTION ALUNO_ASSISTIR_VIDEO(CPF_ALUNO TEXT, CODIGO_VIDEO_AULA INT)
  654. RETURNS VOID
  655. AS $$
  656. DECLARE
  657.     VIDEO_EXISTE INT := (SELECT V_L.COD_VIDEO_AULA FROM VIDEO_AULA V_L WHERE V_L.COD_VIDEO_AULA = CODIGO_VIDEO_AULA);
  658.     ALUNO_EXISTE INT := (SELECT A_L.COD_ALUNO FROM ALUNO A_L WHERE A_L.CPF = CPF_ALUNO);
  659.     DISCIPLINA INT := (SELECT V_L.COD_DISCIPLINA FROM DISCIPLINA D_C INNER JOIN VIDEO_AULA V_L ON D_C.COD_DISCIPLINA =
  660.     V_L.COD_DISCIPLINA WHERE V_L.COD_VIDEO_AULA = CODIGO_VIDEO_AULA);
  661.     MODULO INT := (SELECT D_C.COD_MODULO FROM DISCIPLINA D_C INNER JOIN VIDEO_AULA V_L ON D_C.COD_DISCIPLINA =
  662.     V_L.COD_DISCIPLINA WHERE V_L.COD_VIDEO_AULA = CODIGO_VIDEO_AULA);
  663.     MODULO_ACESSIVEL BOOLEAN := (SELECT A_M.ACESSIVEL FROM ALUNO_MODULO A_M INNER JOIN MODULO M_D ON
  664.     A_M.COD_MODULO = M_D.COD_MODULO WHERE A_M.COD_MODULO = MODULO AND A_M.COD_ALUNO = ALUNO_EXISTE);
  665. BEGIN
  666.  
  667.     IF ALUNO_EXISTE IS NOT NULL THEN
  668.         IF VIDEO_EXISTE IS NOT NULL THEN
  669.             IF MODULO_ACESSIVEL = TRUE THEN
  670.                 IF ALUNO_JA_ASSISTIU(CODIGO_VIDEO_AULA) = FALSE THEN
  671.                     INSERT INTO ALUNO_VIDEOS_ASSISTIDOS VALUES (DEFAULT, ALUNO_EXISTE, CODIGO_VIDEO_AULA);
  672.                 END IF;
  673.             ELSE
  674.                 RAISE EXCEPTION 'VOCÊ NÃO ATINGIU A META OBRIGATORIA DE VIDEOS ASSISTIDOS!';
  675.             END IF;
  676.         ELSE
  677.             RAISE EXCEPTION 'ESSE VIDEO AULA NÃO EXISTE!';
  678.         END IF;
  679.     ELSE
  680.         RAISE EXCEPTION 'ESSE ALUNO NÃO EXISTE, CPF INVALIDO!';
  681.     END IF;
  682. END
  683. $$ LANGUAGE plpgsql;
  684.  
  685. ------------------------------------------------------------------------------------------------------------------------------------------------------------
  686.                         -- ############################################################### --
  687.                         -- #################### META MODULO CONCLUIDA #################### --
  688.                         -- ############################################################### --
  689.  
  690. CREATE OR REPLACE FUNCTION QUANTIDADE_VIDEOS_MODULO(CODIGO_VIDEO_AULA INT)
  691. RETURNS INT
  692. AS $$
  693. DECLARE
  694.     MODULO INT := (SELECT D_C.COD_MODULO FROM DISCIPLINA D_C INNER JOIN VIDEO_AULA V_L ON D_C.COD_DISCIPLINA =
  695.     V_L.COD_DISCIPLINA WHERE V_L.COD_VIDEO_AULA = CODIGO_VIDEO_AULA);
  696.     REGISTRO_DISCIPLINA RECORD;
  697.     REGISTRO_VIDEO RECORD;
  698.     CONTADOR INT := 0;
  699. BEGIN
  700.    
  701.     FOR REGISTRO_DISCIPLINA IN (SELECT * FROM DISCIPLINA D_C WHERE D_C.COD_MODULO = MODULO) LOOP
  702.         FOR REGISTRO_VIDEO IN (SELECT * FROM VIDEO_AULA V_D WHERE V_D.COD_DISCIPLINA = REGISTRO_DISCIPLINA.COD_DISCIPLINA) LOOP
  703.             CONTADOR := CONTADOR + 1;
  704.         END LOOP;
  705.     END LOOP;
  706.  
  707.     RETURN CONTADOR;
  708.    
  709. END
  710. $$ LANGUAGE plpgsql;
  711.  
  712.  
  713. CREATE OR REPLACE FUNCTION QUANTIDADE_VIDEOS_ASSISTINDOS(CODIGO_ALUNO INT)
  714. RETURNS INT
  715. AS $$
  716. DECLARE
  717.     REGISTRO_VIDEO_ASSISTIDO RECORD;
  718.     CONTADOR INT := 0;
  719. BEGIN
  720.    
  721.     FOR REGISTRO_VIDEO_ASSISTIDO IN (SELECT * FROM ALUNO_VIDEOS_ASSISTIDOS A_V_A WHERE A_V_A.COD_ALUNO = CODIGO_ALUNO) LOOP
  722.         CONTADOR := CONTADOR + 1;
  723.     END LOOP;
  724.    
  725.     RETURN CONTADOR;
  726.    
  727. END
  728. $$ LANGUAGE plpgsql;
  729.  
  730.  
  731. CREATE OR REPLACE FUNCTION EVENTO_MODULO_META_CONCLUIDA()
  732. RETURNS TRIGGER
  733. AS $$
  734. DECLARE
  735.     CODIGO_MODULO INT := (SELECT M_D.COD_MODULO FROM MODULO M_D INNER JOIN DISCIPLINA D_C ON
  736.     M_D.COD_MODULO = D_C.COD_MODULO INNER JOIN VIDEO_AULA V_L ON D_C.COD_DISCIPLINA =
  737.     V_L.COD_DISCIPLINA WHERE V_L.COD_VIDEO_AULA = NEW.COD_VIDEO_AULA);
  738.     CODIGO_ALUNO INT := (SELECT A_L.COD_ALUNO FROM ALUNO A_L INNER JOIN ALUNO_CURSO A_C ON
  739.     A_L.COD_ALUNO = A_C.COD_ALUNO WHERE A_C.COD_ALUNO = NEW.COD_ALUNO);
  740.     META_MODULO_PORCENTAGEM FLOAT := TRUNC((QUANTIDADE_VIDEOS_ASSISTINDOS(CODIGO_ALUNO)::DECIMAL / QUANTIDADE_VIDEOS_MODULO(NEW.COD_VIDEO_AULA)::DECIMAL), 1);
  741. BEGIN
  742.    
  743.     IF TG_OP = 'INSERT' THEN
  744.         RAISE NOTICE 'QUANTIDADE VIDEOS MODULO: %', QUANTIDADE_VIDEOS_MODULO(NEW.COD_VIDEO_AULA);
  745.         RAISE NOTICE 'QUANTIDADE VIDEOS ASSISTIDOS: %', QUANTIDADE_VIDEOS_ASSISTINDOS(CODIGO_ALUNO);
  746.         RAISE NOTICE 'RESULTADO DIVISÃO: %', META_MODULO_PORCENTAGEM;
  747.         IF META_MODULO_PORCENTAGEM >= 0.6 THEN
  748.             UPDATE ALUNO_MODULO SET META_CONCLUIDA = TRUE WHERE COD_ALUNO = NEW.COD_ALUNO AND COD_MODULO = CODIGO_MODULO;
  749.         END IF;
  750.     END IF;
  751.     RETURN NEW;
  752.  
  753. END
  754. $$ LANGUAGE plpgsql;
  755.  
  756. CREATE TRIGGER MODULO_META_CONLUIDA
  757. AFTER INSERT ON ALUNO_VIDEOS_ASSISTIDOS
  758. FOR EACH ROW
  759. EXECUTE PROCEDURE EVENTO_MODULO_META_CONCLUIDA();
  760.  
  761. --------------------------------------------------------------------------------------------------------------------------------
  762.                                                
  763.                         -- ############################################################### --
  764.                         -- #################### COMPRAR CURSO ALUNO ###################### --
  765.                         -- ############################################################### --
  766.                            
  767. /* VERIFICA DE EXISTE ALGUM REGISTRO DE DETERMINADA TABELA */
  768. CREATE OR REPLACE FUNCTION VERIFICAR_SE_REGISTRO_EXISTE(COD_ANALISADO INT, TABELA TEXT)
  769. RETURNS BOOLEAN
  770. AS $$
  771. DECLARE
  772.     REGISTRO RECORD;
  773. BEGIN
  774.     IF TABELA = 'ALUNO' THEN
  775.         SELECT * INTO REGISTRO FROM ALUNO WHERE COD_ALUNO = COD_ANALISADO;
  776.         IF REGISTRO IS NOT NULL THEN
  777.             RETURN TRUE;
  778.         ELSE
  779.             RETURN FALSE;
  780.         END IF;
  781.     ELSIF TABELA = 'CURSO' THEN
  782.         SELECT * INTO REGISTRO FROM CURSO WHERE COD_CURSO = COD_ANALISADO;
  783.         IF  REGISTRO IS NOT NULL THEN
  784.             RETURN TRUE;
  785.         ELSE
  786.             RETURN FALSE;
  787.         END IF;
  788.     END IF;
  789. END
  790. $$ LANGUAGE plpgsql;
  791.  
  792. --------------------------------------------------------------------------------------------------------------------------------
  793. --- ################################################ ATUALIZAR_SALDO ####################################################### ---
  794. --------------------------------------------------------------------------------------------------------------------------------
  795. /* ATUALIZA SALDO INCREMENTANDO O VALOR DE SALDO A ALTERAR */
  796. CREATE OR REPLACE FUNCTION ATUALIZAR_SALDO(VALOR_SALDO_A_ALTERAR FLOAT, CODIGO INT, TABELA TEXT)
  797. RETURNS VOID
  798. AS $$
  799. BEGIN
  800.     IF TABELA = 'ALUNO' THEN
  801.         UPDATE ALUNO SET SALDO = SALDO + VALOR_SALDO_A_ALTERAR WHERE COD_ALUNO = CODIGO;
  802.     ELSIF TABELA = 'PROFESSOR' THEN
  803.         UPDATE PROFESSOR SET SALDO = SALDO + VALOR_SALDO_A_ALTERAR WHERE COD_PROFESSOR = CODIGO;
  804.     END IF;
  805. END
  806. $$ LANGUAGE plpgsql;
  807.  
  808. --------------------------------------------------------------------------------------------------------------------------------
  809. --- ################################################## SACAR_SALDO ######################################################### ---
  810. --------------------------------------------------------------------------------------------------------------------------------
  811.  
  812. /* SACA TODO O SALDO DA TABELA */
  813. CREATE OR REPLACE FUNCTION SACAR_SALDO(CODIGO INT, TABELA TEXT)
  814. RETURNS TEXT
  815. AS $$
  816. DECLARE
  817.     SALDO_SACADO FLOAT;
  818. BEGIN
  819.     IF TABELA = 'ALUNO' THEN
  820.         SELECT SALDO INTO SALDO_SACADO FROM ALUNO WHERE CODIGO = COD_ALUNO;
  821.     ELSIF TABELA = 'PROFESSOR' THEN
  822.         SELECT SALDO INTO SALDO_SACADO FROM PROFESSOR WHERE CODIGO = COD_PROFESSOR;
  823.     END IF;
  824.    
  825.     IF SALDO_SACADO = 0 THEN
  826.         RETURN 'SEM SALDO!';
  827.     ELSE
  828.         PERFORM ATUALIZAR_SALDO(-SALDO_SACADO, CODIGO, TABELA);
  829.         RETURN 'FORAM SACADOS R$ ' || CAST(SALDO_SACADO AS TEXT) || '!';
  830.     END IF;
  831. END
  832. $$ LANGUAGE plpgsql;
  833.  
  834. --------------------------------------------------------------------------------------------------------------------------------
  835. --- ################################################# COMPRAR_CURSO ######################################################## ---
  836. --------------------------------------------------------------------------------------------------------------------------------
  837. /* VERIFICA SE DETERMINADO SALDO É SUFICIENTE TENDO EM VISTA O VALOR REQUERIDO */
  838. CREATE OR REPLACE FUNCTION SALDO_SUFICIENTE_PARA_COMPRA(SALDO FLOAT, VALOR_REQUERIDO FLOAT)
  839. RETURNS BOOLEAN
  840. AS $$
  841. BEGIN
  842.     IF SALDO >= VALOR_REQUERIDO THEN
  843.         RETURN TRUE;
  844.     ELSE
  845.         RETURN FALSE;
  846.     END IF;
  847.     RETURN FALSE;
  848. END
  849. $$ LANGUAGE plpgsql;
  850.  
  851. --------------------------------------------------------------------------------------------------------------------------------------------------------------------
  852. /* SELECIONA O SALDO DA TABELA */
  853. CREATE OR REPLACE FUNCTION SELECIONAR_SALDO(COD_ANALISADO INT, TABELA TEXT)
  854. RETURNS FLOAT
  855. AS $$
  856. DECLARE
  857.     SALDO_SELECIONADO FLOAT;
  858. BEGIN
  859.     IF TABELA = 'ALUNO' THEN
  860.         SELECT SALDO INTO SALDO_SELECIONADO FROM ALUNO WHERE COD_ANALISADO = COD_ALUNO;
  861.     ELSIF TABELA = 'PROFESSOR' THEN
  862.         SELECT SALDO INTO SALDO_SELECIONADO FROM PROFESSOR WHERE COD_ANALISADO = COD_PROFESSOR;
  863.     END IF;
  864.     RETURN SALDO_SELECIONADO;
  865. END
  866. $$ LANGUAGE plpgsql;
  867.  
  868. --------------------------------------------------------------------------------------------------------------------------------------------------------------------
  869. /* SELECIONA O PRECO DO CURSO*/
  870. CREATE OR REPLACE FUNCTION SELECIONAR_PRECO(COD_CURSO_ANALISADO INT)
  871. RETURNS FLOAT
  872. AS $$
  873. DECLARE
  874.     PRECO_SELECIONADO FLOAT;
  875. BEGIN
  876.     SELECT PRECO INTO PRECO_SELECIONADO FROM CURSO WHERE COD_CURSO_ANALISADO = COD_CURSO;
  877.     RETURN PRECO_SELECIONADO;
  878. END
  879. $$ LANGUAGE plpgsql;
  880.  
  881. -------------------------------------------------------------------------------------------------------------------------------------------------------------------
  882. /* VERIFICA SE DETERMINADO CURSO E ALUNO JÁ ESTÃO FORMANDO UMA LINHA NA TABELA ALUNO_CURSO */
  883. CREATE OR REPLACE FUNCTION VERIFICAR_VINCULO_ALUNO_CURSO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
  884. RETURNS BOOLEAN
  885. AS $$
  886. DECLARE
  887.     ALUNO_CURSO_ANALISADO RECORD;
  888. BEGIN
  889.     SELECT * INTO ALUNO_CURSO_ANALISADO FROM ALUNO_CURSO WHERE COD_ALUNO_ANALISADO = COD_ALUNO AND COD_CURSO_ANALISADO = COD_CURSO;
  890.  
  891.     IF ALUNO_CURSO_ANALISADO IS NULL THEN
  892.         RETURN FALSE;
  893.     ELSE
  894.         RETURN TRUE;
  895.     END IF;
  896. END
  897. $$ LANGUAGE plpgsql;
  898.  
  899. ------------------------------------------------------------------------------------------------------------------------------------------------------------------
  900. /* VERIFICA SE AINDA É VÁLIDO O PERÍODO NESSE CURSO */
  901. CREATE OR REPLACE FUNCTION PERIODO_CURSANDO_VALIDO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
  902. RETURNS BOOLEAN
  903. AS $$
  904. DECLARE
  905.     DATA_COMPRA_ALUNO_CURSO_ANALISADA DATE;
  906.     DURACAO_CURSO_ANALISADA INT;
  907. BEGIN
  908.     SELECT DATA_COMPRA INTO DATA_COMPRA_ALUNO_CURSO_ANALISADA FROM ALUNO_CURSO WHERE COD_ALUNO_ANALISADO = COD_ALUNO AND COD_CURSO_ANALISADO = COD_CURSO;
  909.     SELECT DURACAO INTO DURACAO_CURSO_ANALISADA FROM CURSO WHERE COD_CURSO_ANALISADO = COD_CURSO;
  910.    
  911.     IF DATA_COMPRA_ALUNO_CURSO_ANALISADA + DURACAO_CURSO_ANALISADA >= DATE(NOW()) THEN  -- <<<<<<<<<<<<<<<<<<<<<<<  OBS: DEIXAR DURACAO COMO INT  <<<<<<<<<<<<<<<<<<<<<<<<<<<<
  912.         RETURN TRUE;
  913.     ELSE
  914.         RETURN FALSE;
  915.     END IF;
  916. END
  917. $$ LANGUAGE plpgsql;
  918.  
  919. -----------------------------------------------------------------------------------------------------------------------------------------------------------------
  920. /* VERIFICA SE ALUNO AINDA ESTÁ CURSANDO */
  921. CREATE OR REPLACE FUNCTION ALUNO_AINDA_CURSANDO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
  922. RETURNS BOOLEAN
  923. AS $$
  924. BEGIN
  925.     IF VERIFICAR_VINCULO_ALUNO_CURSO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) IS TRUE AND PERIODO_CURSANDO_VALIDO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) IS TRUE THEN
  926.         RETURN TRUE;
  927.     ELSE
  928.         RETURN FALSE;
  929.     END IF;
  930. END
  931. $$ LANGUAGE plpgsql;
  932.  
  933.  
  934. -----------------------------------------------------------------------------------------------------------------------------------------------------------------
  935. /* VERIFICA SE CURSO ESTÁ DISPONIVEL */
  936. CREATE OR REPLACE FUNCTION CURSO_DISPONIVEL(COD_CURSO_ANALISADO INT)
  937. RETURNS BOOLEAN
  938. AS $$
  939. DECLARE
  940.     DISPONIBILIDADE_CURSO_ANALISADO BOOLEAN;
  941. BEGIN
  942.     SELECT DISPONIBILIDADE INTO DISPONIBILIDADE_CURSO_ANALISADO FROM CURSO WHERE COD_CURSO = COD_CURSO_ANALISADO;
  943.     RETURN DISPONIBILIDADE_CURSO_ANALISADO;
  944. END
  945. $$ LANGUAGE plpgsql;
  946.  
  947.  
  948. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
  949. /* VERIFICA SE ALUNO JÁ CURSOU (E NÃO CURSA MAIS) O CURSO. */
  950. CREATE OR REPLACE FUNCTION ALUNO_JA_CURSOU(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
  951. RETURNS BOOLEAN
  952. AS $$
  953. BEGIN
  954.     IF VERIFICAR_VINCULO_ALUNO_CURSO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) = TRUE AND PERIODO_CURSANDO_VALIDO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) != TRUE THEN
  955.         RETURN TRUE;
  956.     ELSE
  957.         RETURN FALSE;
  958.     END IF;
  959. END
  960. $$ LANGUAGE plpgsql;
  961.  
  962.  
  963. --------------------------------------------------------------------------------------------------------------------------------
  964. /* INSERIR OU ATUALIZAR ALUNO_CURSO QUANDO ALUNO FOR COMPRAR O CURSO */
  965. CREATE OR REPLACE FUNCTION COMPRAR_CURSO(COD_ALUNO_ANALISADO INT, COD_CURSO_ANALISADO INT)
  966. RETURNS VOID
  967. AS $$
  968. BEGIN
  969.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_ALUNO_ANALISADO, 'ALUNO') IS FALSE THEN
  970.         RAISE EXCEPTION 'ESSE ALUNO AINDA NÃO FOI CADASTRADO!';
  971.  
  972.     ELSIF VERIFICAR_SE_REGISTRO_EXISTE(COD_CURSO_ANALISADO, 'CURSO') IS FALSE THEN
  973.         RAISE EXCEPTION 'ESSE CURSO AINDA NÃO FOI CADASTRADO!';
  974.  
  975.     ELSIF ALUNO_AINDA_CURSANDO(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) IS TRUE THEN
  976.         RAISE EXCEPTION 'VOCÊ AINDA ESTÁ CURSANDO ESSE CURSO. COMPRA DO CURSO REJEITADA!';
  977.  
  978.     ELSIF CURSO_DISPONIVEL(COD_CURSO_ANALISADO) != TRUE THEN
  979.         RAISE EXCEPTION 'CURSO INDISPONÍVEL PARA NOVAS COMPRAS!';
  980.  
  981.     ELSIF ALUNO_JA_CURSOU(COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO) = TRUE THEN
  982.         PERFORM ATUALIZAR_SALDO(-SELECIONAR_PRECO(COD_CURSO_ANALISADO), COD_ALUNO_ANALISADO, 'ALUNO');
  983.         UPDATE ALUNO_CURSO SET DATA_COMPRA = DATE(NOW()), NOTA_AVALIACAO = NULL WHERE COD_ALUNO = COD_ALUNO_ANALISADO AND COD_CURSO = COD_CURSO_ANALISADO;
  984.  
  985.     ELSE
  986.         PERFORM ATUALIZAR_SALDO(-SELECIONAR_PRECO(COD_CURSO_ANALISADO), COD_ALUNO_ANALISADO, 'ALUNO');
  987.         INSERT INTO ALUNO_CURSO VALUES (DEFAULT, DATE(NOW()), NULL, COD_ALUNO_ANALISADO, COD_CURSO_ANALISADO);
  988.     END IF;
  989.  
  990. END
  991. $$ LANGUAGE plpgsql;
  992.  
  993. --------------------------------------------------------------------------------------------------------------------------------
  994. --- ########################################### PROFESSOR_RECEBER_SALARIO ################################################## ---
  995. --------------------------------------------------------------------------------------------------------------------------------
  996. /* CALCULA A DATA_ULTIMO_PAGAMENTO DO PAGAMENTO MAIS RECENTE NO DIA 01 */
  997. CREATE OR REPLACE FUNCTION CALCULAR_DATA_PAGAMENTO_ATUAL()
  998. RETURNS DATE
  999. AS $$
  1000. DECLARE
  1001.     MES_DATA_PAGAMENTO_ATUAL INT;
  1002.     ANO_DATA_PAGAMENTO_ATUAL INT;
  1003.     DATA_PAGAMENTO_ATUAL DATE;
  1004. BEGIN
  1005.     MES_DATA_PAGAMENTO_ATUAL := EXTRACT(MONTH FROM DATE(NOW()));
  1006.     ANO_DATA_PAGAMENTO_ATUAL := EXTRACT(YEAR FROM DATE(NOW()));
  1007.  
  1008.     DATA_PAGAMENTO_ATUAL := CAST(CAST(ANO_DATA_PAGAMENTO_ATUAL AS VARCHAR(4)) || '-' || CAST(MES_DATA_PAGAMENTO_ATUAL AS VARCHAR(2)) || '-01' AS DATE);
  1009.     RETURN DATA_PAGAMENTO_ATUAL;
  1010. END
  1011. $$ LANGUAGE plpgsql;
  1012.  
  1013.  
  1014. --------------------------------------------------------------------------------------------------------------------------------
  1015. /* FAZ O PROFESSOR RECEBER O SALÁRIO */
  1016. CREATE OR REPLACE FUNCTION PROFESSOR_RECEBER_SALARIO(COD_PROFESSOR_ANALISADO INT)
  1017. RETURNS VOID
  1018. AS $$
  1019. DECLARE
  1020.     DATA_ULTIMO_PAGAMENTO_ANALISADO DATE;
  1021.     DATA_PAGAMENTO_ATUAL DATE;
  1022.     SALARIO_A_PAGAR FLOAT;
  1023. BEGIN
  1024.     SELECT DATA_ULTIMO_PAGAMENTO INTO DATA_ULTIMO_PAGAMENTO_ANALISADO FROM PROFESSOR WHERE COD_PROFESSOR = COD_PROFESSOR_ANALISADO;
  1025.     DATA_PAGAMENTO_ATUAL := CALCULAR_DATA_PAGAMENTO_ATUAL();
  1026.  
  1027.     SELECT COALESCE(SUM(PRECO), 0) INTO SALARIO_A_PAGAR FROM ALUNO_CURSO INNER JOIN CURSO ON ALUNO_CURSO.COD_CURSO = CURSO.COD_CURSO WHERE COD_PROFESSOR = COD_PROFESSOR_ANALISADO AND DATA_COMPRA < DATA_PAGAMENTO_ATUAL AND DATA_COMPRA >= DATA_ULTIMO_PAGAMENTO_ANALISADO;
  1028.     UPDATE PROFESSOR SET SALDO = SALDO + SALARIO_A_PAGAR, DATA_ULTIMO_PAGAMENTO = DATA_PAGAMENTO_ATUAL WHERE COD_PROFESSOR = COD_PROFESSOR_ANALISADO;
  1029. END
  1030. $$ LANGUAGE plpgsql;
  1031.  
  1032.  
  1033. --------------------------------------------------------------------------------------------------------------------------------
  1034. --- ################################################ CRIAR_QUESTAO ######################################################### ---
  1035. --------------------------------------------------------------------------------------------------------------------------------
  1036. CREATE OR REPLACE FUNCTION CRIAR_QUESTAO(TEXTO_INSERIDO TEXT, COD_DISCIPLINA_INSERIDA INT)
  1037. RETURNS VOID
  1038. AS $$
  1039. BEGIN
  1040.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_DISCIPLINA_INSERIDA, 'DISCIPLINA') IS FALSE THEN
  1041.         RAISE EXCEPTION 'ESSA DISCIPLINA AINDA NÃO FOI CADASTRADA!';
  1042.     ELSIF LENGTH(TEXTO_INSERIDO) < 10 THEN
  1043.         RAISE EXCEPTION 'TEXTO DA QUESTÃO MUITO CURTO COM MENOS DE 10 CARACTERES INVÁLIDO!';
  1044.     ELSE
  1045.         INSERT INTO QUESTAO VALUES (DEFAULT, TEXTO_INSERIDO, COD_DISCIPLINA_INSERIDA);
  1046.     END IF;
  1047. END
  1048. $$ LANGUAGE plpgsql;
  1049.  
  1050.  
  1051. --------------------------------------------------------------------------------------------------------------------------------
  1052. --- ############################################### DELETAR_QUESTAO ######################################################## ---
  1053. --------------------------------------------------------------------------------------------------------------------------------
  1054. CREATE OR REPLACE FUNCTION DELETAR_QUESTAO(COD_QUESTAO_DELETADA INT)
  1055. RETURNS VOID
  1056. AS $$
  1057. BEGIN
  1058.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_QUESTAO_DELETADA, 'QUESTAO') IS FALSE THEN
  1059.         RAISE EXCEPTION 'ESSA QUESTÃO AINDA NÃO FOI CADASTRADA!';
  1060.     ELSE
  1061.         DELETE FROM QUESTAO WHERE COD_QUESTAO = COD_QUESTAO_DELETADA;
  1062.     END IF;
  1063. END
  1064. $$ LANGUAGE plpgsql;
  1065.  
  1066.  
  1067. --------------------------------------------------------------------------------------------------------------------------------
  1068. --- ############################################## CRIAR_QUESTIONARIO ###################################################### ---
  1069. --------------------------------------------------------------------------------------------------------------------------------
  1070. CREATE OR REPLACE FUNCTION CRIAR_QUESTIONARIO(NOME_INSERIDO TEXT, COD_DISCIPLINA_INSERIDA INT)
  1071. RETURNS VOID
  1072. AS $$
  1073. BEGIN
  1074.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_DISCIPLINA_INSERIDA, 'DISCIPLINA') IS FALSE THEN
  1075.         RAISE EXCEPTION 'ESSA DISCIPLINA AINDA NÃO FOI CADASTRADA!';
  1076.     ELSE
  1077.         INSERT INTO QUESTIONARIO VALUES (DEFAULT, NOME_INSERIDO, COD_DISCIPLINA_INSERIDA);
  1078.     END IF;
  1079. END
  1080. $$ LANGUAGE plpgsql;
  1081.  
  1082.  
  1083. --------------------------------------------------------------------------------------------------------------------------------
  1084. --- ############################################# DELETAR_QUESTIONARIO ##################################################### ---
  1085. --------------------------------------------------------------------------------------------------------------------------------
  1086. CREATE OR REPLACE FUNCTION DELETAR_QUESTIONARIO(COD_QUESTIONARIO_DELETADO INT)
  1087. RETURNS VOID
  1088. AS $$
  1089. BEGIN
  1090.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_QUESTIONARIO_DELETADO, 'QUESTIONARIO') IS FALSE THEN
  1091.         RAISE EXCEPTION 'ESSE QUESTIONARIO AINDA NÃO FOI CADASTRADO!';
  1092.     ELSE
  1093.         DELETE FROM QUESTIONARIO WHERE COD_QUESTIONARIO = COD_QUESTIONARIO_DELETADO;
  1094.     END IF;
  1095. END
  1096. $$ LANGUAGE plpgsql;
  1097.  
  1098.  
  1099. --------------------------------------------------------------------------------------------------------------------------------
  1100. --- ######################################## VINCULAR_QUESTAO_A_QUESTIONARIO ############################################### ---
  1101. --------------------------------------------------------------------------------------------------------------------------------
  1102. /* VERIFICA SE DETERMINADA QUESTÃO E QUESTIONÁRIO JÁ ESTÃO FORMANDO UMA LINHA NA TABELA ALUNO_CURSO */
  1103. CREATE OR REPLACE FUNCTION VERIFICAR_VINCULO_QUESTAO_QUESTIONARIO(COD_QUESTIONARIO_ANALISADO INT, COD_QUESTAO_ANALISADA INT)
  1104. RETURNS BOOLEAN
  1105. AS $$
  1106. DECLARE
  1107.     QUESTAO_QUESTIONARIO_ANALISADO RECORD;
  1108. BEGIN
  1109.     SELECT * INTO QUESTAO_QUESTIONARIO_ANALISADO FROM QUESTAO_QUESTIONARIO WHERE COD_QUESTIONARIO = COD_QUESTIONARIO_ANALISADO AND COD_QUESTAO = COD_QUESTAO_ANALISADA;
  1110.     IF QUESTAO_QUESTIONARIO_ANALISADO IS NULL THEN
  1111.         RETURN FALSE;
  1112.     ELSE
  1113.         RETURN TRUE;
  1114.     END IF;
  1115. END
  1116. $$ LANGUAGE plpgsql;
  1117.  
  1118. --------------------------------------------------------------------------------------------------------------------------------
  1119. CREATE OR REPLACE FUNCTION VINCULAR_QUESTAO_A_QUESTIONARIO(COD_QUESTIONARIO_VINCULADO INT, COD_QUESTAO_VINCULADA INT)
  1120. RETURNS VOID
  1121. AS $$
  1122. DECLARE
  1123.     COD_DISCIPLINA_DO_QUESTIONARIO_VINCULADO INT := (SELECT COD_DISCIPLINA FROM QUESTIONARIO WHERE COD_QUESTIONARIO = COD_QUESTIONARIO_VINCULADO);
  1124.     COD_DISCIPLINA_DA_QUESTAO_VINCULADA INT := (SELECT COD_DISCIPLINA FROM QUESTAO WHERE COD_QUESTAO = COD_QUESTAO_VINCULADA);
  1125. BEGIN
  1126.     --------------------------------------------------------------------------------------------------------------------------------
  1127.     --------------------------------------------------------------------------------------------------------------------------------
  1128.     --------------------------------------------------------------------------------------------------------------------------------
  1129.     --------------------------------------------------------------------------------------------------------------------------------
  1130.     ------------------------- VERIFICAR SE A DISCIPLINA É DO PROFESSOR (TEM QUE RECEBER O COD_PROFESSOR) ---------------------------
  1131.     --------------------------------------------------------------------------------------------------------------------------------
  1132.     --------------------------------------------------------------------------------------------------------------------------------
  1133.     --------------------------------------------------------------------------------------------------------------------------------
  1134.     --------------------------------------------------------------------------------------------------------------------------------
  1135.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_QUESTIONARIO_VINCULADO, 'QUESTIONARIO') IS FALSE THEN
  1136.         RAISE EXCEPTION 'ESSE QUESTIONARIO AINDA NÃO FOI CADASTRADO!';
  1137.     ELSIF VERIFICAR_SE_REGISTRO_EXISTE(COD_QUESTAO_VINCULADA, 'QUESTAO') IS FALSE THEN
  1138.         RAISE EXCEPTION 'ESSA QUESTAO AINDA NÃO FOI CADASTRADA!';
  1139.     ELSIF COD_DISCIPLINA_DO_QUESTIONARIO_VINCULADO != COD_DISCIPLINA_DA_QUESTAO_VINCULADA THEN
  1140.         RAISE EXCEPTION 'NÃO SE PODE VINCULAR UMA QUESTAO A UM QUESTIONARIO DE OUTRA DISCIPLINA!';
  1141.     ELSIF VERIFICAR_VINCULO_QUESTAO_QUESTIONARIO(COD_QUESTIONARIO_VINCULADO, COD_QUESTAO_VINCULADA) IS TRUE THEN
  1142.         RAISE EXCEPTION 'ESSA QUESTÃO JÁ ESTÁ VINCULADA A ESSE QUESTIONÁRIO!';
  1143.     ELSE
  1144.         INSERT INTO QUESTAO_QUESTIONARIO VALUES (DEFAULT, COD_QUESTAO_VINCULADA, COD_QUESTIONARIO_VINCULADO);
  1145.     END IF;
  1146. END
  1147. $$ LANGUAGE plpgsql;
  1148.  
  1149.  
  1150. --------------------------------------------------------------------------------------------------------------------------------
  1151. --- ########################################## SUBMETER_RESPOSTA_DE_QUESTAO ################################################ ---
  1152. --------------------------------------------------------------------------------------------------------------------------------
  1153. CREATE OR REPLACE FUNCTION VERIFICAR_VINCULO_QUESTAO_ALUNO(COD_ALUNO_ANALISADO INT, COD_QUESTAO_ANALISADA INT)
  1154. RETURNS BOOLEAN
  1155. AS $$
  1156. DECLARE
  1157.     ALUNO_QUESTAO_ANALISADO RECORD;
  1158. BEGIN
  1159.     SELECT * INTO ALUNO_QUESTAO_ANALISADO FROM QUESTAO_ALUNO WHERE COD_ALUNO = COD_ALUNO_ANALISADO AND COD_QUESTAO = COD_QUESTAO_ANALISADA;
  1160.     IF ALUNO_QUESTAO_ANALISADO IS NULL THEN
  1161.         RETURN FALSE;
  1162.     ELSE
  1163.         RETURN TRUE;
  1164.     END IF;
  1165. END
  1166. $$ LANGUAGE plpgsql;
  1167.  
  1168. --------------------------------------------------------------------------------------------------------------------------------
  1169. CREATE OR REPLACE FUNCTION SUBMETER_RESPOSTA_DE_QUESTAO(COD_ALUNO_ANALISADO INT, COD_QUESTAO_SUBMETIDA INT, RESPOSTA_ALUNO_SUBMETIDA TEXT)
  1170. RETURNS VOID
  1171. AS $$
  1172. BEGIN
  1173.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_ALUNO_ANALISADO, 'ALUNO') IS FALSE THEN
  1174.         RAISE EXCEPTION 'ESSE ALUNO AINDA NÃO FOI CADASTRADO!';
  1175.     ELSIF VERIFICAR_SE_REGISTRO_EXISTE(COD_QUESTAO_SUBMETIDA, 'QUESTAO') IS FALSE THEN
  1176.         RAISE EXCEPTION 'ESSA QUESTAO AINDA NÃO FOI CADASTRADA!';
  1177.     ELSIF VERIFICAR_VINCULO_QUESTAO_ALUNO(COD_ALUNO_ANALISADO, COD_QUESTAO_SUBMETIDA) IS TRUE THEN
  1178.         UPDATE QUESTAO_ALUNO SET RESPOSTA_ALUNO = RESPOSTA_ALUNO_SUBMETIDA, RESPOSTA_CORRETA = DEFAULT WHERE COD_ALUNO = COD_ALUNO_ANALISADO AND COD_QUESTAO = COD_QUESTAO_SUBMETIDA;
  1179.     ELSE
  1180.         INSERT INTO QUESTAO_ALUNO VALUES (DEFAULT, RESPOSTA_ALUNO_SUBMETIDA, DEFAULT, COD_QUESTAO_SUBMETIDA, COD_ALUNO_ANALISADO);
  1181.     END IF;
  1182. END
  1183. $$ LANGUAGE plpgsql;
  1184.  
  1185.  
  1186.  
  1187.  
  1188. --------------------------------------------------------------------------------------------------------------------------------
  1189. --- ########################################## LISTAR_QUESTOES_DOS_ALUNOS ################################################## ---
  1190. --------------------------------------------------------------------------------------------------------------------------------
  1191. CREATE OR REPLACE FUNCTION LISTAR_QUESTOES_DOS_ALUNOS(COD_PROFESSOR_ANALISADO INT)
  1192. RETURNS TABLE(COD_QUESTAO_ALUNO INT, RESPOSTA_CORRETA VARCHAR(13))
  1193. AS $$
  1194. BEGIN
  1195.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_PROFESSOR_ANALISADO, 'PROFESSOR') IS FALSE THEN
  1196.         RAISE EXCEPTION 'ESSE PROFESSOR AINDA NÃO FOI CADASTRADO!';
  1197.     END IF;
  1198.    
  1199.     RETURN QUERY SELECT Q_A.COD_QUESTAO_ALUNO, Q_A.RESPOSTA_CORRETA FROM QUESTAO_ALUNO Q_A INNER JOIN QUESTAO_QUESTIONARIO Q_Q ON Q_A.COD_QUESTAO = Q_Q.COD_QUESTAO
  1200.     INNER JOIN QUESTIONARIO Q_R ON Q_Q.COD_QUESTIONARIO = Q_R.COD_QUESTIONARIO INNER JOIN DISCIPLINA D_C ON Q_R.COD_DISCIPLINA = D_C.COD_DISCIPLINA
  1201.     INNER JOIN MODULO M_D ON D_C.COD_MODULO = M_D.COD_MODULO INNER JOIN CURSO C_R ON M_D.COD_CURSO = C_R.COD_CURSO WHERE C_R.COD_PROFESSOR = COD_PROFESSOR_ANALISADO
  1202.     ORDER BY C_R.COD_CURSO, M_D.COD_MODULO, D_C.COD_DISCIPLINA, Q_R.COD_QUESTIONARIO, Q_Q.COD_QUESTAO_QUESTIONARIO, Q_Q.COD_QUESTAO, Q_A.COD_QUESTAO_ALUNO;
  1203. END
  1204. $$ LANGUAGE plpgsql;
  1205.  
  1206.  
  1207. --------------------------------------------------------------------------------------------------------------------------------
  1208. --- ################################################ CORRIGIR_QUESTAO ###################################################### ---
  1209. --------------------------------------------------------------------------------------------------------------------------------
  1210. CREATE OR REPLACE FUNCTION CORRIGIR_QUESTAO(COD_PROFESSOR_ANALISADO INT, COD_QUESTAO_ALUNO_CORRIGIDA INT, RESPOSTA_CORRETA_INSERIDA TEXT)
  1211. RETURNS VOID
  1212. AS $$
  1213. BEGIN
  1214.     IF VERIFICAR_SE_REGISTRO_EXISTE(COD_PROFESSOR_ANALISADO, 'PROFESSOR') IS FALSE THEN
  1215.         RAISE EXCEPTION 'ESSE PROFESSOR AINDA NÃO FOI CADASTRADO!';
  1216.     ELSIF VERIFICAR_SE_REGISTRO_EXISTE(COD_QUESTAO_ALUNO_CORRIGIDA, 'QUESTAO_ALUNO') IS FALSE THEN
  1217.         RAISE EXCEPTION 'ESSE VÍNCULO QUESTÃO_ALUNO AINDA NÃO FOI CADASTRADO!';
  1218.     ELSIF (COD_QUESTAO_ALUNO_CORRIGIDA IN (SELECT COD_QUESTAO_ALUNO FROM LISTAR_QUESTOES_DOS_ALUNOS(COD_PROFESSOR_ANALISADO))) IS FALSE THEN
  1219.         RAISE EXCEPTION 'VOCÊ NÃO TEM PERMISSÃO PARA MANIPULAÇÃO ESSE VÍNCULO QUESTÃO_ALUNO! ESSA QUESTÃO AINDA NÃO FOI POSTA EM UM QUESTIONÁRIO DE UM CURSO SEU!';
  1220.     ELSIF NOT (RESPOSTA_CORRETA_INSERIDA ILIKE 'CORRETA' OR RESPOSTA_CORRETA_INSERIDA ILIKE 'INCORRETA') THEN
  1221.         RAISE EXCEPTION 'DEVE-SE INFORMAR A RESPOSTA DO ALUNO APENAS COMO "CORRETA" OU "INCORRETA"';
  1222.     ELSE
  1223.         UPDATE QUESTAO_ALUNO SET RESPOSTA_CORRETA = RESPOSTA_CORRETA_INSERIDA WHERE COD_QUESTAO_ALUNO = COD_QUESTAO_ALUNO_CORRIGIDA;
  1224.     END IF;
  1225. END
  1226. $$ LANGUAGE plpgsql;
  1227.  
  1228.  
  1229.  
  1230.                         -- ############################################################### --
  1231.                         -- ############ FUNCTIONS DA TRIGGER DISPONIBILIDADE ############# --
  1232.                         -- ############################################################### --
  1233.  
  1234. CREATE OR REPLACE FUNCTION VALIDAR_DISCIPLINA(CODIGO_DISCIPLINA INT)
  1235. RETURNS BOOLEAN
  1236. AS $$
  1237. DECLARE
  1238.     NUM_VIDEOS INT := (SELECT COUNT(*) FROM VIDEO_AULA V_A WHERE V_A.COD_DISCIPLINA = CODIGO_DISCIPLINA);
  1239. BEGIN
  1240.    
  1241.     IF NUM_VIDEOS >= 3 THEN
  1242.         RAISE NOTICE 'TRUE';
  1243.         RETURN TRUE;
  1244.     ELSE
  1245.         RAISE NOTICE 'FALSE';
  1246.         RETURN FALSE;
  1247.     END IF;
  1248. END
  1249. $$ LANGUAGE plpgsql;
  1250.                                            
  1251. CREATE OR REPLACE FUNCTION VALIDAR_MODULO(CODIGO_MODULO INT)
  1252. RETURNS BOOLEAN
  1253. AS $$
  1254. DECLARE
  1255.     NUM_DISCIPLINAS_VALIDAS INT := 0;
  1256.     REGISTRO_DISCIPLINA RECORD;
  1257. BEGIN
  1258.    
  1259.     FOR REGISTRO_DISCIPLINA IN (SELECT * FROM DISCIPLINA D_P WHERE D_P.COD_MODULO = CODIGO_MODULO) LOOP
  1260.         IF VALIDAR_DISCIPLINA(REGISTRO_DISCIPLINA.COD_DISCIPLINA) = TRUE THEN
  1261.             NUM_DISCIPLINAS_VALIDAS := NUM_DISCIPLINAS_VALIDAS + 1;
  1262.         END IF;
  1263.     END LOOP;
  1264.    
  1265.     IF NUM_DISCIPLINAS_VALIDAS >= 3 THEN
  1266.         RAISE NOTICE 'TRUE';
  1267.         RETURN TRUE;
  1268.     ELSE
  1269.         RAISE NOTICE 'FALSE';
  1270.         RETURN FALSE;
  1271.     END IF;
  1272. END
  1273. $$ LANGUAGE plpgsql;
  1274.  
  1275. CREATE OR REPLACE FUNCTION VALIDAR_CURSO(CODIGO_CURSO INT)
  1276. RETURNS BOOLEAN
  1277. AS $$
  1278. DECLARE
  1279.     NUM_MODULOS_VALIDOS INT := 0;
  1280.     REGISTRO_MODULO RECORD;
  1281. BEGIN
  1282.  
  1283.     FOR REGISTRO_MODULO IN (SELECT * FROM MODULO M_D WHERE M_D.COD_CURSO = CODIGO_CURSO) LOOP
  1284.         IF VALIDAR_MODULO(REGISTRO_MODULO.COD_MODULO) = TRUE THEN
  1285.             NUM_MODULOS_VALIDOS := NUM_MODULOS_VALIDOS + 1;
  1286.         END IF;
  1287.     END LOOP;
  1288.    
  1289.     IF NUM_MODULOS_VALIDOS >= 3 THEN
  1290.         RAISE NOTICE 'TRUE';
  1291.         RETURN TRUE;
  1292.     ELSE
  1293.         RAISE NOTICE 'FALSE';
  1294.         RETURN FALSE;
  1295.     END IF;
  1296. END
  1297. $$ LANGUAGE plpgsql;
  1298.  
  1299. --------------------------------------------------------------------------------------------------------------------------------------------------------------
  1300.                             -- ################################################## --
  1301.                             -- ######## TRIGGER COM AFTER DISPONIBILIDADE ####### --
  1302.                             -- ################################################## --
  1303.  
  1304. CREATE OR REPLACE FUNCTION EVENTO_MODULO_CURSO()
  1305. RETURNS TRIGGER
  1306. AS $$
  1307. BEGIN
  1308.    
  1309.     IF TG_OP = 'DELETE' THEN
  1310.         IF VALIDAR_CURSO(OLD.COD_CURSO) = FALSE THEN
  1311.             UPDATE CURSO SET DISPONIBILIDADE = FALSE WHERE COD_CURSO = OLD.COD_CURSO;
  1312.             UPDATE CURSO SET PUBLICADO = FALSE WHERE COD_CURSO = OLD.COD_CURSO;
  1313.         END IF;
  1314.     END IF;
  1315.    
  1316.     RETURN NEW;
  1317.  
  1318. END
  1319. $$ LANGUAGE plpgsql;
  1320.  
  1321. CREATE OR REPLACE FUNCTION EVENTO_DISCIPLINA_CURSO()
  1322. RETURNS TRIGGER
  1323. AS $$
  1324. DECLARE
  1325.     OLD_COD_CURSO INT := (SELECT COD_CURSO FROM MODULO M_D WHERE M_D.COD_MODULO = OLD.COD_MODULO);
  1326. BEGIN
  1327.    
  1328.     IF TG_OP = 'DELETE' THEN
  1329.         IF VALIDAR_CURSO(OLD_COD_CURSO) = FALSE THEN
  1330.             UPDATE CURSO SET DISPONIBILIDADE = FALSE WHERE COD_CURSO = OLD_COD_CURSO;
  1331.             UPDATE CURSO SET PUBLICADO = FALSE WHERE COD_CURSO = OLD_COD_CURSO;
  1332.         END IF;
  1333.     END IF;
  1334.  
  1335.     RETURN NEW;
  1336.    
  1337. END
  1338. $$ LANGUAGE plpgsql;
  1339.  
  1340. CREATE OR REPLACE FUNCTION EVENTO_VIDEO_CURSO()
  1341. RETURNS TRIGGER
  1342. AS $$
  1343. DECLARE
  1344.     NEW_COD_CURSO INT := (SELECT M_D.COD_CURSO FROM MODULO M_D WHERE M_D.COD_MODULO =
  1345.     (SELECT D_C.COD_MODULO FROM DISCIPLINA D_C WHERE D_C.COD_DISCIPLINA = NEW.COD_DISCIPLINA));
  1346. BEGIN
  1347.    
  1348.     IF TG_OP = 'INSERT' THEN
  1349.         IF VALIDAR_CURSO(NEW_COD_CURSO) = TRUE THEN
  1350.             UPDATE CURSO SET DISPONIBILIDADE = TRUE WHERE COD_CURSO = NEW_COD_CURSO;
  1351.         END IF;
  1352.        
  1353.     ELSIF TG_OP = 'DELETE' THEN
  1354.         IF VALIDAR_CURSO((SELECT COD_CURSO FROM MODULO M_D WHERE M_D.COD_MODULO = (SELECT D_C.COD_MODULO FROM DISCIPLINA D_C WHERE D_C.COD_DISCIPLINA = OLD.COD_DISCIPLINA))) = FALSE THEN
  1355.             UPDATE CURSO SET DISPONIBILIDADE = FALSE WHERE COD_CURSO = OLD_COD_CURSO;
  1356.             UPDATE CURSO SET PUBLICADO = FALSE WHERE COD_CURSO = OLD_COD_CURSO;
  1357.         END IF;
  1358.     END IF;
  1359.    
  1360.     RETURN NEW;
  1361.  
  1362. END
  1363. $$ LANGUAGE plpgsql;
  1364.  
  1365. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1366.                             -- ################################################## --
  1367.                             -- ############# TRIGGER DISPONIBILIDADE ############ --
  1368.                             -- ################################################## --
  1369.  
  1370. CREATE TRIGGER EVENTO_ANALISA_DISPONIBILIDADE_CURSO_VIDEO
  1371. AFTER INSERT OR DELETE ON VIDEO_AULA
  1372. FOR EACH ROW
  1373. EXECUTE PROCEDURE EVENTO_VIDEO_CURSO();
  1374.  
  1375. CREATE TRIGGER EVENTO_ANALISA_DISPONIBILIDADE_CURSO_DISCIPLINA
  1376. AFTER DELETE ON DISCIPLINA
  1377. FOR EACH ROW
  1378. EXECUTE PROCEDURE EVENTO_DISCIPLINA_CURSO();
  1379.  
  1380. CREATE TRIGGER EVENTO_ANALISA_DISPONIBILIDADE_CURSO_MODULO
  1381. AFTER DELETE ON MODULO
  1382. FOR EACH ROW
  1383. EXECUTE PROCEDURE EVENTO_MODULO_CURSO();
  1384.  
  1385. -------------------------------------------------------------------------------------------------------------------------------
  1386.                             -- ################################################## --
  1387.                             -- ######### TRIGGER PROFESSOR RECEBER SALDO ######## --
  1388.                             -- ################################################## --
  1389.  
  1390. CREATE OR REPLACE FUNCTION EVENTO_PROFESSOR_RECEBER_SALARIO()
  1391. RETURNS TRIGGER
  1392. AS $$
  1393. DECLARE
  1394.     COD_PROFESSOR_ANALISADO INT;
  1395. BEGIN
  1396.     SELECT P_F.COD_PROFESSOR INTO COD_PROFESSOR_ANALISADO FROM ALUNO_CURSO A_C INNER JOIN CURSO C_R ON A_C.COD_CURSO = C_R.COD_CURSO INNER JOIN PROFESSOR P_F ON C_R.COD_PROFESSOR = P_F.COD_PROFESSOR WHERE A_C.COD_ALUNO_CURSO = NEW.COD_ALUNO_CURSO;
  1397.     PERFORM PROFESSOR_RECEBER_SALARIO(COD_PROFESSOR_ANALISADO);
  1398.     RETURN NEW;
  1399. END;
  1400. $$ LANGUAGE plpgsql;
  1401.  
  1402. CREATE TRIGGER ALUNO_ATIVAR_EVENTO_PROFESSOR_RECEBER_SALARIO
  1403. AFTER INSERT OR UPDATE
  1404. ON ALUNO_CURSO FOR EACH ROW
  1405. EXECUTE PROCEDURE EVENTO_PROFESSOR_RECEBER_SALARIO();
  1406.  
  1407. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1408.                             -- ################################################## --
  1409.                             -- ################### EXECUÇÕES #################### --
  1410.                             -- ################################################## --
  1411.  
  1412. SELECT * FROM ALUNO_MODULO
  1413. SELECT * FROM ALUNO_CURSO
  1414. SELECT * FROM ALUNO
  1415. SELECT * FROM PROFESSOR
  1416. SELECT * FROM CURSO
  1417. SELECT * FROM MODULO
  1418. SELECT * FROM DISCIPLINA
  1419. SELECT * FROM VIDEO_AULA
  1420. SELECT * FROM ALUNO_VIDEOS_ASSISTIDOS
  1421.  
  1422.  
  1423. /* PARAMENTROS COD_ALUNO, NOME, CPF, DATA_NASCIMENTO, EMAIL, SENHA, TABELA */
  1424. SELECT FROM INSERIR_ALUNO_E_PROFESSOR
  1425. (1, 'NELSON', '1122334455', '1992-07-23', 'NELSON@GMAIL.COM', '123', 'ALUNO');
  1426. SELECT FROM INSERIR_ALUNO_E_PROFESSOR
  1427. (2, 'CARLOS', '5544332211', '2000-01-23', 'CARLOS@GMAIL.COM', '123', 'ALUNO');
  1428. SELECT FROM INSERIR_ALUNO_E_PROFESSOR
  1429. (1, 'GEOVANE', '123456', '1990-05-02', 'GEOVANE@GMAIL.COM', '123', 'PROFESSOR');
  1430. SELECT FROM INSERIR_ALUNO_E_PROFESSOR
  1431. (2, 'VILARINHO', '654321', '1999-03-10', 'VILARINHO@GMAIL.COM', '123', 'PROFESSOR');
  1432.  
  1433. /* PARAMENTROS CPF, TITULO_CURSO, DESCRICAO_CURSO, VALOR_CURSO */
  1434. SELECT FROM CRIAR_CURSO
  1435. ('123456', 1, 'MATEMATICA', 'APRENDENDO A FAZER CALCULOS', 100);
  1436.  
  1437. /* PARAMETROS CPF_PROFESSOR, COD_CURSO, ARRAY DE MODULO/S, ARRAY DESCRICAO/OES, ARRAY TEMPO_MODULO */
  1438. SELECT FROM CRIAR_MODULO
  1439. ('123456', 1,
  1440. ARRAY ['MODULO 1', 'MODULO 2', 'MODULO 3'],
  1441. ARRAY ['DESCRICAO 1', 'DESCRICAO 2', 'DESCRICAO 3'],
  1442. ARRAY [10, 20, 30]);
  1443.  
  1444. /* PARAMETROS CPF_PROFESSOR, CODIGO_MODULO, ARRAY DISCIPLINA/S ARRAY DESCRICAO/OES */
  1445. SELECT FROM CRIAR_DISCIPLINAS
  1446. ('123456', 1,
  1447. ARRAY ['APRENDENDO A SOMAR', 'APRENDENDO A DIVIDIR', 'APRENDENDO A SUBTRAIR'],
  1448. ARRAY ['DESCRICAO 1', 'DESCRICAO 2', 'DESCRICAO 3'])
  1449. SELECT FROM CRIAR_DISCIPLINAS
  1450. ('123456', 2,
  1451. ARRAY ['APRENDENDO A DERIVADA', 'APRENDENDO A BASKARA', 'APRENDENDO A ALGEBRA'],
  1452. ARRAY ['DESCRICAO 1', 'DESCRICAO 2', 'DESCRICAO 3'])
  1453. SELECT FROM CRIAR_DISCIPLINAS
  1454. ('123456', 3,
  1455. ARRAY ['APRENDENDO A EQUAÇÃO', 'APRENDENDO GEOMETRIA', 'APRENDENDO A PRODUTO CARTEZIADO'],
  1456. ARRAY ['DESCRICAO 1', 'DESCRICAO 2', 'DESCRICAO 3'])
  1457.  
  1458. /* PARAMETROS CPF_PROFESSOR,COD_DISCIPLINA, ARRAY VIDEO/S, ARRAY DESCRICAO/OES, ARRAY TEMPO_VIDEO
  1459. ADICIONAR O CODIGO DA DISCIPLINA DOS MODULOS VINGENTES */
  1460. SELECT FROM ADICIONAR_VIDEO_AULA
  1461. ('123456', 9,
  1462. ARRAY ['TESTE'],
  1463. ARRAY ['DESC 1'],
  1464. ARRAY [10]);
  1465.  
  1466. SELECT FROM ADICIONAR_VIDEO_AULA
  1467. ('123456', 1,
  1468. ARRAY ['VIDEO 1', 'VIDEO 2', 'VIDEO 3'],
  1469. ARRAY ['DESC 1', 'DESC 2', 'DESC 3'],
  1470. ARRAY [10, 5, 3]);
  1471.  
  1472. /* PARAMETROS CPF, COD_VIDEO_AULA */
  1473. SELECT FROM DELETAR_VIDEO('123456', 37)
  1474.  
  1475. /* PARAMETROS CPF, COD_DISCIPLINA */
  1476. SELECT FROM DELETAR_DISCIPLINA('123456', 1)
  1477.  
  1478. /* PARAMETROS CPF, COD_MODULO */
  1479. SELECT FROM DELETAR_MODULO('123456', 1)
  1480.  
  1481. /* PARAMETROS CPF, COD_CURSO*/
  1482. SELECT FROM PUBLICAR_CURSO('123456', 1)
  1483.  
  1484. /* ALUNO COMPRANDO CURSO  PARAMETROS COD_ALUNO, COD_CURSO*/
  1485. SELECT FROM COMPRAR_CURSO(1, 1);
  1486.  
  1487. /* ALUNO ASSISTIR VIDEO AULA */
  1488. SELECT FROM ALUNO_ASSISTIR_VIDEO('1122334455', 12)
  1489.  
  1490.  
  1491. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1492. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1493. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1494. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1495. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1496. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1497. -------------------------------------------------------------------------------------------------------------------------------------------------------------
  1498.  
  1499. SELECT * FROM PROFESSOR;
  1500.  
  1501. SELECT * FROM CURSO;
  1502.  
  1503. SELECT * FROM MODULO;
  1504. SELECT * FROM PRE_REQUESITO;
  1505.  
  1506.  
  1507. INSERT INTO PROFESSOR VALUES (1, 'PROFS', '123456', '1998-08-08', 'OPROFS321@GMAIL.COM', '123', 10000, '2000-01-01');
  1508.  
  1509. INSERT INTO CURSO VALUES (1, 'CURSO', 'CURSO CURSO', 1000, 200, 15, TRUE, TRUE, 1);
  1510.  
  1511. INSERT INTO MODULO VALUES (1, 'MATEMATICA', 'DESCRICAO', 100, 1);
  1512. INSERT INTO MODULO VALUES (2, 'PORTUGUES', 'DESCRICAO', 120, 1);
  1513. INSERT INTO MODULO VALUES (3, 'CIENCIAS', 'DESCRICAO', 150, 1);
  1514. INSERT INTO MODULO VALUES (4, 'HISTORIA', 'DESCRICAO', 50, 1);
  1515. INSERT INTO MODULO VALUES (5, 'GEOGRAFIA', 'DESCRICAO', 180, 1);
  1516.  
  1517.  
  1518. CREATE OR REPLACE FUNCTION VERIFICAR_VALIDADE_PRE_REQUISITO(COD_MODULO_ANALISADO INT, COD_MODULOS_PERCORRIDOS INT[])
  1519. RETURNS BOOLEAN
  1520. AS $$
  1521. DECLARE
  1522.     REGISTRO_MODULO_PRE_REQUISITO RECORD;
  1523. BEGIN
  1524.     IF (SELECT ARRAY[COD_MODULO_ANALISADO] <@ COD_MODULOS_PERCORRIDOS) IS TRUE THEN
  1525.         RETURN FALSE;
  1526.     ELSE
  1527.         COD_MODULOS_PERCORRIDOS := COD_MODULOS_PERCORRIDOS || ARRAY[COD_MODULO_ANALISADO];
  1528.         FOR REGISTRO_MODULO_PRE_REQUISITO IN (SELECT * FROM PRE_REQUISITO WHERE COD_MODULO = COD_MODULO_ANALISADO) LOOP
  1529.             RAISE NOTICE 'VERIFICAR AGORA PARA: (%,%)', REGISTRO_MODULO_PRE_REQUISITO.COD_MODULO_PRE_REQUISITO, COD_MODULOS_PERCORRIDOS;
  1530.             IF VERIFICAR_VALIDADE_PRE_REQUISITO(REGISTRO_MODULO_PRE_REQUISITO.COD_MODULO_PRE_REQUISITO, COD_MODULOS_PERCORRIDOS) IS FALSE THEN
  1531.                 RETURN FALSE;
  1532.             ELSE
  1533.                 RETURN TRUE;
  1534.             END IF;
  1535.         END LOOP;
  1536.         RETURN TRUE;
  1537.     END IF;
  1538. END
  1539. $$ LANGUAGE plpgsql;
  1540.  
  1541. CREATE OR REPLACE FUNCTION EVENTO_INSERT_PRE_REQUISITO()
  1542. RETURNS TRIGGER
  1543. AS $$
  1544. BEGIN
  1545.     IF VERIFICAR_VALIDADE_PRE_REQUISITO(NEW.COD_MODULO, ARRAY[NEW.COD_MODULO_PRE_REQUISITO]::INT[]) IS FALSE THEN
  1546.         RAISE EXCEPTION 'VOCÊ NÃO PODE FAZER ESSA RELAÇÃO MODULO - MODULO_PRE_REQUISITO. PRE-REQUITOS ENTRAM EM IMPASSE!';
  1547.     ELSE
  1548.         RETURN NEW;
  1549.     END IF;
  1550.    
  1551. END
  1552. $$ LANGUAGE plpgsql;
  1553.  
  1554.  
  1555. -------------------- OBS: PRE_REQUISITO E ATRIBUTOS TAO COM NOMES ERRADOS ---------------------
  1556.  
  1557. CREATE TRIGGER TRIGGER_PRE_REQUISITO
  1558. BEFORE INSERT
  1559. ON PRE_REQUISITO FOR EACH ROW
  1560. EXECUTE PROCEDURE EVENTO_INSERT_PRE_REQUISITO();
  1561.  
  1562.  
  1563.  
  1564. SELECT * FROM MODULO;
  1565. SELECT * FROM PRE_REQUISITO;
  1566.  
  1567. DELETE FROM PRE_REQUISITO;
  1568.  
  1569. -- DÁ CERTO
  1570. INSERT INTO PRE_REQUISITO VALUES (100, 4, 1);
  1571. INSERT INTO PRE_REQUISITO VALUES (101, 4, 2);
  1572. INSERT INTO PRE_REQUISITO VALUES (102, 3, 1);
  1573. INSERT INTO PRE_REQUISITO VALUES (103, 5, 3);
  1574. INSERT INTO PRE_REQUISITO VALUES (104, 5, 4);
  1575.  
  1576. -- NÃO DÁ CERTO
  1577. INSERT INTO PRE_REQUISITO VALUES (100, 4, 1);
  1578. INSERT INTO PRE_REQUISITO VALUES (101, 1, 2);
  1579. INSERT INTO PRE_REQUISITO VALUES (102, 4, 2);
  1580. INSERT INTO PRE_REQUISITO VALUES (103, 3, 1);
  1581. INSERT INTO PRE_REQUISITO VALUES (104, 5, 3);
  1582. INSERT INTO PRE_REQUISITO VALUES (105, 5, 4);
  1583.  
  1584.  
  1585. -- VERIFICAR SE O VALOR TA NA LISTA
  1586. SELECT ARRAY[1] <@ ARRAY [1,2,4]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement