{"id":26263692,"url":"https://github.com/iliangithub/proyecto_pl-sql_ejercicio1","last_synced_at":"2026-01-02T05:19:11.326Z","repository":{"id":278028864,"uuid":"934254243","full_name":"iliangithub/Proyecto_PL-SQL_ejercicio1","owner":"iliangithub","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-17T22:08:00.000Z","size":84,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-17T22:29:07.764Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iliangithub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-17T14:26:23.000Z","updated_at":"2025-02-17T22:08:03.000Z","dependencies_parsed_at":"2025-02-17T22:40:22.260Z","dependency_job_id":null,"html_url":"https://github.com/iliangithub/Proyecto_PL-SQL_ejercicio1","commit_stats":null,"previous_names":["iliangithub/pl-sql","iliangithub/proyecto_pl-sql_ejercicio1"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iliangithub%2FProyecto_PL-SQL_ejercicio1","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iliangithub%2FProyecto_PL-SQL_ejercicio1/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iliangithub%2FProyecto_PL-SQL_ejercicio1/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iliangithub%2FProyecto_PL-SQL_ejercicio1/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iliangithub","download_url":"https://codeload.github.com/iliangithub/Proyecto_PL-SQL_ejercicio1/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243505898,"owners_count":20301619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-14T01:19:16.058Z","updated_at":"2026-01-02T05:19:11.280Z","avatar_url":"https://github.com/iliangithub.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ejercicios PL/SQL\n## Introducción. ¿Qué es PL/SQL?\n\nMis apuntes: https://github.com/iliangithub/Apuntes_PL-SQL/blob/main/README.md\n\nEntonces, SQL es un lenguaje de programación especializado y diseñado para gestionar y manipular BASES DE DATOS RELACIONALES. Y es un lenguaje DECLARATIVO, es decir, describes lo que quieres hacer, en lugar de escribir paso a paso cómo hacerlo.\n\n\u003e[!TIP]\n\u003e SQL, entonces, no es un lenguaje de programación completo porque no tiene características como la manipulación de memoria o estructuras de control avanzadas fuera del ámbito de las bases de datos.\n\u003e- Los for, while, if, foreach.\n\u003e- o arrays para manipular la memoria.\n\u003e\n\nSQL cuenta con sublenguajes, para que sea más preciso:\n\n- DDL (Data Definition Languaje) Create, Alter, Drop, Truncate.\n- DML (Data Manipulation Language) Select, Insert, Update, Delete.\n- DCL (Data Control Language) Grant, Revoke.\n- TCL (Transaction Control Language) START TRANSACTION... Commit, Rollback, Savepoint.\n\nY **PL/SQL NO ES UN SUBLENGUAJE**\n- PL/SQL (Procedural SQL) aquí es donde hay programación, como bucles condiciones y variables,\n  - PL/SQL (En Oracle).\n  - T-SQL (SQL Server).\n\nEntonces, sabiendo esto.\n\nNecesitamos un programa QUE SEA CAPAZ DE SOPORTAR PL/SQL, como Oracle SQL Developer (Que he usado en el Grado Superior...) (O el SQL Plus, que eso es formato CLI ) (El que usaba en Capgemini). \n\n\u003e[!IMPORTANT]\n\u003eEntonces en el SQL Developer puedo hacer SELECTS y demás, SÍ, y en el Plus también.\n\u003e\n\u003e**Sin embargo, en MySQL Workbench no puedo hacer PL/SQL**, es exclusivo de Oracle, mientras que MySQL usa un lenguaje procedimental diferente llamado \"MySQL Procedural Language\" dentro de sus procedimientos almacenados.\n\u003e\n\u003eEntonces, MySQL Workbench utiliza **ALGO PARECIDO al PL/SQL, pero NO es igual de potente**\n\u003e\n\u003e| Característica | PL/SQL (Oracle) | MySQL (Procedural) |\n\u003e| ------------- | ------------- | ------------- |\n\u003e| Base de datos | **Oracle** | **MySQL** |\n\u003e| Lenguaje Procedural  | PL/SQL | Procedural SQL (MySQL) |\n\u003e| Soporta paquetes\t  | ✅ Sí | ❌ No |\n\u003e| Triggers avanzados  | ✅ Sí | ⚠️ Limitados |\n\u003e| Cursores explícitos | ✅ Sí | ⚠️ Limitados  |\n\u003e| Manejo de excepciones  | ✅ Sí (EXCEPTION)  | ⚠️ Limitado (DECLARE HANDLER) |\n\nEn cuestión, para PL/SQL se usa el Oracle SQL Developer, porque es más potente que la opción de MySQL Workbench, está muuy limitado, además de que como hemos dicho antes, no es lo mismo. Es exclusivo de Oracle, pero MySQL pues tiene su alternativa.\n\n# Introducción al ejercicio.\nVoy a crear el entorno usando Docker:\n\nPara ello en Windows voy a descargar el docker-desktop, no hay otra, no es como en Ubuntu que tienes la forma gráfica y forma CMD.\nAquí tienes que descargar el docker-desktop para poder usar los comandos.\n\nHaciendo click a este enlace te lo descargará automaticamente. Es la versión AMD64.\n\nhttps://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_source=docker\u0026utm_medium=webreferral\u0026utm_campaign=dd-smartbutton\u0026utm_location=module\n\n# Errores docker:\n## Error WSL.\n![image](https://github.com/user-attachments/assets/9483ad39-7500-4096-80e2-f30ccdda2adf)\n\n## Docker Daemon Not Running.\n**Vamos a comprobar que el demonio docker funcione.**\n\nEste fue un error que NO fue culpa mía y me hizo fallar una entrevista entera:\n\n```\n$ docker build .\n\nERROR: error during connect: this error may indicate that the docker daemon is not running: Head \"http://%2F%2F.%2Fpipe%2Fdocker_engine/_ping\": open //./pipe/docker_engine: The system cannot find the file specified.\n```\n\nEn cualquier caso, funciona, porque:\n\n```\n$ docker --version\nDocker version 27.5.1, build 9f9e405\n```\n\n# Instalar la imagen de Oracle.\n\n**NO se encuentra en Dockerhub**. Se encuentra aquí:\n\nhttps://container-registry.oracle.com/ords/f?p=113:10:10309525717681:::::\n\ny podemos encontrar cosas como el GoldenGate, MySQL, etc...\n\nConcretamente buscamos la imagen que está aquí:\n\nhttps://container-registry.oracle.com/ords/f?p=113:4:10309525717681:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:803,803,Oracle%20Database%20Express%20Edition,Oracle%20Database%20Express%20Edition,1,0\u0026cs=3kSUSZKpypeaX9BO1ZKQTkvorkgcR9U3WrhddSE5Y2qCsoB10k2zZsV3yoMEsq5F7OWxfmVlKpdHnQc-fgHZCRA\n\n![image](https://github.com/user-attachments/assets/3e2f30b7-a029-4d17-a262-bb762c894bd8)\n\nY aquí está el comando docker para descargar la imagen.\n\n```\ndocker pull container-registry.oracle.com/database/express:latest\n```\n\nEn la propia documentación de la página, nos indican que la imagen, tiene una base de datos por defecto, para que la puesta en marcha sea muy rápida, sirve para CI/CD.\n\nY si queremos iniciar la instancia pues se hace así:\n\n```\ndocker run -d --name \u003coracle-db\u003e container-registry.oracle.com/database/express:21.3.0-xe\n```\n\n**EN MI CASO**  voy a usar este comando para hacer el contenedor:\n\n```\ndocker run --name oracle-xe-ilian-pruebas -p 1521:1521 -e ORACLE_PWD=123456 container-registry.oracle.com/database/express:latest\n```\n\nEntonces, una vez tengamos el contenedor, tenemos la Base de Datos en sí. \n\n```\ndocker ps | grep oracle-xe-ilian-pruebas\n```\nO este otro también:\n```\ndocker ps --filter \"name=oracle-xe-ilian-pruebas\"\n```\nAhora necesitamos pues trabajar con ella.\n\nPara ello voy a descargar SQL Developer.\n\n# Oracle SQL Developer.\n\nSe trata de un programa que es como \"portable\", no requiere de una isntalación clásica, con un .exe y darle a siguiente, siguiente...\n\nhttps://download.oracle.com/otn_software/java/sqldeveloper/sqldeveloper-24.3.1.347.1826-x64.zip\n\nEste es el enlace a la descarga.\n\n![image](https://github.com/user-attachments/assets/1ad08265-9e49-4ca0-b9d8-5dbff6f24676)\n\nVoy a abrir el programa, para crear una nueva conexión.\n\n*Recordemos, que esto es un simple programa gráfico para acceder a la Base de Datos de Oracle de contenedor*:\n\n![image](https://github.com/user-attachments/assets/156832e0-7f77-4c41-b2b7-9350049f2a5c)\n\n![image](https://github.com/user-attachments/assets/543edf93-cbe9-4fcb-8c16-aceabd47afd1)\n\nY quiero comprobar de que efectivamente pues se ha conectado a la BD:\n\n![image](https://github.com/user-attachments/assets/b9b4fbe8-144f-4279-9c09-efae314a0e45)\n\n# El ejercicio en sí. El Básico, Fizz Buzz.\n\n\u003e[!IMPORTANT]\n\u003eAquí dejo mis apuntes o las cosas que he aprendido en el Grado Superior sobre el PL/SQL.\n\u003e https://github.com/iliangithub/Apuntes_PL-SQL\n\u003e\n\n# Crea un procedimiento que agregue un nuevo empleado a la tabla EMPLOYEES con los siguientes datos:\n\n```\n  CREATE OR REPLACE PROCEDURE anadir_empleado (\n      p_empleado_id IN NUMBER,\n      p_nombre IN VARCHAR2,\n      p_apellido IN VARCHAR2,\n      \n  )\nIS\nBEGIN\n    INSERT INTO tabla_empleado (empleado_id, nombre, apellido)\n    VALUES ( p_empleado_id, p_nombre, p_apellido);\n    \n    COMMIT;\nEND;\n/\n```\n¿Qué pasa si el ID ya existe? (Deberías manejar excepciones con EXCEPTION WHEN OTHERS THEN ...)\nAunque eso no debería de ocurrir.\n\n# Función para obtener un valor.\n\n```\nCREATE OR REPLACE FUNCTION obtener_salario (\n    p_empleado_id IN NUMBER\n)\nRETURN NUMBER\nIS\n  v_salario NUMBER;\n  \nBEGIN\n    SELECT salario INTO v_salario FROM empleado WHERE empleado_id = p_empleado_id;\n    RETURN v_salario\nEXCEPTION\n    WHEN NO_DATA_FOUND THEN RETURN NULL;\nEND;\n/\n```\n\nPara que sirve el IS, para separar la declaración del procedimiento\n`CREATE OR REPLACE PROCEDURE....`\n\nde su implementación.\n\nUsa DECLARE en bloques anónimos, porque no tienen cabecera.\nUsa IS en procedimientos, funciones y triggers, porque ya tienen cabecera y necesitan una separación formal entre la definición y el código.\n\n# Manejar errores:\n\n```\nCREATE OR REPLACE FUNCTION get_salary(p_employee_id IN NUMBER) RETURN NUMBER\nIS\n    v_salary NUMBER;\nBEGIN\n    SELECT salary INTO v_salary\n    FROM employees\n    WHERE employee_id = p_employee_id;\n\n    RETURN v_salary;\nEXCEPTION\n    WHEN NO_DATA_FOUND THEN\n        DBMS_OUTPUT.PUT_LINE('Empleado no encontrado');\n        RETURN NULL;\n    WHEN OTHERS THEN\n        DBMS_OUTPUT.PUT_LINE('Error inesperado: ' || SQLERRM);\n        RETURN NULL;\nEND;\n/\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filiangithub%2Fproyecto_pl-sql_ejercicio1","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filiangithub%2Fproyecto_pl-sql_ejercicio1","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filiangithub%2Fproyecto_pl-sql_ejercicio1/lists"}