Advertisement
AmbarG

repasoEjerciciosDriveTG

Nov 18th, 2024
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Crear tablas
  2. create table cargo (
  3.     id_cargo varchar(3) primary key,
  4.     nombre_cargo varchar(50)
  5. );
  6.  
  7. create table tipo (
  8.     id_tipo varchar(3) primary key,
  9.     nombre_tipo varchar(50)
  10. );
  11.  
  12. create table proveedor (
  13.     cuit_proveedor varchar(20) primary key,
  14.     nombre_proveedor varchar(50)
  15. );
  16.  
  17. create table empleado (
  18.     codigo_empleado int primary key,
  19.     nombre_empleado varchar(50),
  20.     dni_empleado varchar(10),
  21.     id_cargo varchar(3),
  22.     foreign key (id_cargo) references cargo(id_cargo)
  23. );
  24.  
  25. create table cliente (
  26.     codigo_cliente int primary key,
  27.     cuit_cliente varchar(20),
  28.     nombre_cliente varchar(50),
  29.     telefono_cliente varchar(20),
  30.     id_tipo varchar(3),
  31.     foreign key (id_tipo) references tipo(id_tipo)
  32. );
  33.  
  34. create table producto (
  35.     codigo_producto int primary key,
  36.     nombre_producto varchar(50),
  37.     precio_producto numeric(10, 2),
  38.     cuit_proveedor varchar(20),
  39.     foreign key (cuit_proveedor) references proveedor(cuit_proveedor)
  40. );
  41.  
  42. create table pedido (
  43.     codigo_pedido int primary key,
  44.     codigo_cliente int,
  45.     codigo_empleado int,
  46.     codigo_compania int,
  47.     fecha_pedido date,
  48.     fecha_envio date,
  49.     direccion_destinatario varchar(100),
  50.     foreign key (codigo_cliente) references cliente(codigo_cliente),
  51.     foreign key (codigo_empleado) references empleado(codigo_empleado)
  52. );
  53.  
  54. create table detalle_pedido (
  55.     codigo_pedido int,
  56.     codigo_producto int,
  57.     cantidad int,
  58.     porcentaje_descuento numeric(5, 2),
  59.     primary key (codigo_pedido, codigo_producto),
  60.     foreign key (codigo_pedido) references pedido(codigo_pedido),
  61.     foreign key (codigo_producto) references producto(codigo_producto)
  62. );
  63.  
  64. create table compania (
  65.     codigo_compania int primary key,
  66.     nombre_compania varchar(50),
  67.     telefono_compania varchar(20),
  68.     codigo_provincia int
  69. );
  70.  
  71. create table provincia (
  72.     codigo_provincia int primary key,
  73.     nombre_provincia varchar(50)
  74. );
  75.  
  76. -- Cargar datos en las tablas
  77. insert into cargo (id_cargo, nombre_cargo) values
  78. ('ger', 'gerente'),
  79. ('enc', 'encargado'),
  80. ('ven', 'vendedor');
  81.  
  82. insert into tipo (id_tipo, nombre_tipo) values
  83. ('cf', 'consumidor final'),
  84. ('ri', 'responsable inscripto'),
  85. ('ex', 'exento');
  86.  
  87. insert into proveedor (cuit_proveedor, nombre_proveedor) values
  88. ('11-11111111-1', 'proveedor1'),
  89. ('22-22222222-2', 'proveedor2'),
  90. ('33-33333333-3', 'proveedor3');
  91.  
  92. insert into empleado (codigo_empleado, nombre_empleado, dni_empleado, id_cargo) values
  93. (2810, 'empleado1', '22222222', 'ven'),
  94. (2811, 'empleado2', '33333333', 'ven'),
  95. (2812, 'empleado3', '44444444', 'enc'),
  96. (2813, 'empleado4', '55555555', 'ger'),
  97. (2814, 'empleado5', '11111111', 'ven');
  98.  
  99. insert into cliente (codigo_cliente, cuit_cliente, nombre_cliente, telefono_cliente, id_tipo) values
  100. (1001, '20-2110010-1', 'cliente1', '111', 'cf'),
  101. (2002, '20-2120020-2', 'cliente2', '222', 'ex'),
  102. (3003, '20-2130030-3', 'cliente3', '333', 'cf'),
  103. (4004, '20-2140040-4', 'cliente4', '444', 'ri'),
  104. (5005, '20-2150050-5', 'cliente5', '555', 'ri');
  105.  
  106. insert into producto (codigo_producto, nombre_producto, precio_producto, cuit_proveedor) values
  107. (111, 'pendrive 32gb', 3550.00, '11-11111111-1'),
  108. (222, 'cámara web', 16000.00, '11-11111111-1'),
  109. (333, 'resma a4', 3000.00, '22-22222222-2'),
  110. (444, 'caja 100dvd', 12000.00, '33-33333333-3'),
  111. (555, 'pendrive 64gb', 5000.00, '22-22222222-2');
  112.  
  113. insert into pedido (codigo_pedido, codigo_cliente, codigo_empleado, codigo_compania, fecha_pedido, fecha_envio, direccion_destinatario) values
  114. (1, 1001, 2814, 10, '2023-09-29', '2021-10-02', 'direccion1'),
  115. (2, 4004, 2814, 20, '2023-09-29', '2021-10-03', 'direccion2'),
  116. (3, 1001, 2810, 40, '2023-09-29', '2021-10-10', 'direccion3'),
  117. (4, 2002, 2814, 30, '2023-10-02', '2021-10-02', 'direccion4'),
  118. (5, 3003, 2811, 30, '2023-10-02', '2021-10-03', 'direccion5'),
  119. (6, 5005, 2810, 30, '2023-10-03', '2021-10-05', 'direccion6');
  120.  
  121. insert into detalle_pedido (codigo_pedido, codigo_producto, cantidad, porcentaje_descuento) values
  122. (1, 111, 2, 0),
  123. (1, 222, 5, 0),
  124. (3, 444, 20, 10.00),
  125. (4, 333, 10, 5.00),
  126. (5, 555, 1, 0),
  127. (5, 111, 1, 0),
  128. (5, 222, 1, 15.00),
  129. (5, 333, 1, 0),
  130. (6, 555, 5, 10.00);
  131.  
  132. insert into compania (codigo_compania, nombre_compania, telefono_compania, codigo_provincia) values
  133. (10, 'compañía1', '155155155', 381),
  134. (20, 'compañía2', '152152152', 388),
  135. (30, 'compañía3', '153153153', 388),
  136. (40, 'compañía4', '154154154', 387);
  137.  
  138. insert into provincia (codigo_provincia, nombre_provincia) values
  139. (381, 'jujuy'),
  140. (388, 'tucumán'),
  141. (387, 'salta');
  142.  
  143. --1. Realice una función que muestre por pantalla la cantidad total de registros de todas las tablas.
  144.  
  145. create or replace function total_registros()
  146. returns void as $$
  147. declare
  148.     total integer;
  149. begin
  150.     select ((select count(*) cargo)+
  151.     (select count(*) tipo_cliente)+
  152.     (select count(*) proveedor)+
  153.     (select count(*)empleado)+
  154.     (select count (*)cliente)+
  155.     (select count(*) producto)+
  156.     (select count(*) pedido)+
  157.     (select count(*)detalle_pedido)+
  158.     (select count(*) compania)+
  159.     (select count(*) provincia))
  160.     into total;
  161.  
  162.     raise notice 'Total de registros: %', total;
  163. end;
  164. $$language plpgsql;
  165.  
  166. select total_registros();
  167.  
  168. create or replace function total()
  169. returns int as $$
  170. declare
  171.     total integer;
  172. begin
  173.     select ((select count(*) cargo)+
  174.     (select count(*) tipo_cliente)+
  175.     (select count(*) proveedor)+
  176.     (select count(*)empleado)+
  177.     (select count (*)cliente)+
  178.     (select count(*) producto)+
  179.     (select count(*) pedido)+
  180.     (select count(*)detalle_pedido)+
  181.     (select count(*) compania)+
  182.     (select count(*) provincia))
  183.     into total;
  184.  
  185.     return total;
  186. end;
  187. $$language plpgsql;
  188.  
  189. select total();
  190.  
  191. --2. Realice una función que reciba como parámetro el código de provincia y devuelva el nombre de las compañías asociadas con el mismo.
  192.  
  193. create or replace function asociadas(codigoprov integer)
  194. returns table(nombre_comp varchar, codigo_prov integer) as $$
  195. begin
  196.     return query
  197.     select c.nombre_compania, p.codigo_provincia from compania c
  198.     inner join provincia p on c.codigo_provincia = p.codigo_provincia
  199.     where p.codigo_provincia = codigoprov;
  200. end;
  201. $$language plpgsql;
  202.  
  203. drop function asociadas;
  204. select * from asociadas (388);
  205.  
  206. --3. Realice una función que reciba como parámetro una fecha de pedido y devuelva el monto total de pedidos para esa fecha.
  207.  
  208. create or replace function monto_total(fechap date)
  209. returns numeric as $$
  210. declare
  211.     total numeric;
  212. begin
  213.     select sum(dp.cantidad * p.precio_producto * (1- dp.porcentaje_descuento / 100))
  214.     into total
  215.     from detalle_pedido dp
  216.     inner join pedido pe on dp.codigo_pedido = pe.codigo_pedido
  217.     inner join producto p on dp.codigo_producto = dp.codigo_producto
  218.     where pe.fecha_pedido = fechap;
  219.  
  220.     if total is null then
  221.         total := 0;
  222.     end if;
  223.  
  224.     return total;
  225. end;
  226. $$language plpgsql;
  227.  
  228. select * from monto_total ('03-10-2023');
  229.  
  230. --4. Realice una función que reciba como parámetros una “Fecha Pedido desde” y una “Fecha
  231. --Pedido hasta”, cargue el cursor con los datos de pedidos, lea el cursor y grabe dichos
  232. --datos en la tabla “pedido_especial”
  233.  
  234. create table pedido_especial(fecha_pedido date, fecha_envio date, direccion_destinatario varchar (20));
  235.  
  236. create or replace function grabar(desde date,hasta date)
  237. returns void as $$
  238. declare
  239.     datos_pedidos cursor for
  240.         select pe.fecha_pedido, pe.fecha_envio, pe.direccion_destinatario
  241.         from pedido pe
  242.         where pe.fecha_pedido between desde and hasta;
  243.        
  244.     v_fecha_pedido date;
  245.     v_fecha_envio date;
  246.     v_direccion varchar(20);
  247. begin
  248.  
  249.     open datos_pedidos;
  250.    
  251.     loop
  252.         fetch  datos_pedidos into v_fecha_pedido,v_fecha_envio,v_direccion;
  253.         exit when not found;
  254.  
  255.         insert into pedido_especial(fecha_pedido,fecha_envio,direccion_destinatario)
  256.         values(v_fecha_pedido,v_fecha_envio,v_direccion);
  257.  
  258.     end loop;
  259.  
  260.     close datos_pedidos;
  261.  
  262. end;
  263. $$language plpgsql;
  264.  
  265. drop function grabar();
  266. select grabar('02-10-2023','03-10-2023');
  267. select * from pedido_especial;
  268. select grabar('29-09-2023','03-10-2023');
  269.  
  270. --Realice un trigger que antes de guardar un nuevo detalle de pedido con un producto cuyo
  271. --precio sea superior a $10.000,00; le aplique un porcentaje descuento a 10% (valor a
  272. --guardar en la columna respectiva).
  273.  
  274.  
  275. create or replace function aplicarpor()
  276. returns trigger as $$
  277. begin
  278.     if(select precio_producto from producto  where codigo_producto = new.codigo_producto)>10000 then
  279.         new.porcentaje_descuento :=10;
  280.     end if;
  281.  
  282.     return new;
  283. end;
  284. $$language plpgsql;
  285.  
  286. create trigger verificaraplicacion
  287. before insert on detalle_pedido
  288. for each row
  289. execute function aplicarpor();
  290.  
  291. --Realice la creación de la tabla “Pedidos Pendientes” con los siguientes campos: código
  292. --pedido, nombre cliente, nombre empleado, nombre compania, fecha pedido. Crear un
  293. --trigger que luego de insertar un pedido sin fecha de envío, le asigne la fecha actual,
  294. --guarde sus datos en la tabla “Pedidos Pendientes”.
  295.  
  296. create table pedidos_pendientes(
  297.     codigo_pedido integer,
  298.     nombre_cliente varchar(20),
  299.     nombre_empleado varchar(20),
  300.     nombre_compania varchar(20),
  301.     fecha_pedido date
  302. );
  303.  
  304.  
  305.  
  306. create or replace function asignar()
  307. returns trigger as $$
  308. begin
  309.     if(select fecha_envio from pedido where codigo_pedido = new.codigo_pedido) = '' then
  310.    
  311.     insert into pedidos pendientes(
  312.         codigo_pedido,
  313.         nombre_cliente,
  314.         nombre_empleado,
  315.         nombre_compania,
  316.         fecha_pedido
  317.         );
  318.     values(new.codigo_pedido,
  319.     new.nombre_cliente,
  320.     new.nombre_empeado,
  321.     new.nombre_compania,
  322.     new.fecha_pedido);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement