generating-stored-procedures
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseStored Procedure Generator
存储过程生成器
Generate production-ready stored procedures for PostgreSQL, MySQL, and SQL Server with proper error handling, transaction management, and security best practices.
为PostgreSQL、MySQL和SQL Server生成可用于生产环境的存储过程,具备完善的错误处理、事务管理和安全最佳实践。
Prerequisites
前提条件
- Database connection credentials (host, port, database, user, password)
- Appropriate permissions: CREATE PROCEDURE, CREATE FUNCTION, EXECUTE
- Target database type identified (PostgreSQL, MySQL, or SQL Server)
- 数据库连接凭证(主机、端口、数据库、用户名、密码)
- 适当的权限:CREATE PROCEDURE、CREATE FUNCTION、EXECUTE
- 已确定目标数据库类型(PostgreSQL、MySQL或SQL Server)
Instructions
操作步骤
1. Identify Database Type and Requirements
1. 确定数据库类型和需求
Determine the target database and procedure requirements:
sql
-- PostgreSQL: Check version and extensions
SELECT version();
\dx
-- MySQL: Check version and settings
SELECT VERSION();
SHOW VARIABLES LIKE 'sql_mode';
-- SQL Server: Check version and edition
SELECT @@VERSION;确定目标数据库和存储过程需求:
sql
-- PostgreSQL: Check version and extensions
SELECT version();
\dx
-- MySQL: Check version and settings
SELECT VERSION();
SHOW VARIABLES LIKE 'sql_mode';
-- SQL Server: Check version and edition
SELECT @@VERSION;2. Generate Stored Procedure
2. 生成存储过程
PostgreSQL Function (PL/pgSQL):
sql
CREATE OR REPLACE FUNCTION get_user_by_id(p_user_id INTEGER)
RETURNS TABLE(id INTEGER, username VARCHAR, email VARCHAR, created_at TIMESTAMP)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT u.id, u.username, u.email, u.created_at
FROM users u
WHERE u.id = p_user_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'User with ID % not found', p_user_id
USING ERRCODE = 'P0002';
END IF;
END;
$$;MySQL Stored Procedure:
sql
DELIMITER //
CREATE PROCEDURE GetUserById(IN p_user_id INT)
BEGIN
DECLARE user_exists INT DEFAULT 0;
SELECT COUNT(*) INTO user_exists FROM users WHERE id = p_user_id;
IF user_exists = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'User not found';
END IF;
SELECT id, username, email, created_at
FROM users
WHERE id = p_user_id;
END //
DELIMITER ;SQL Server Stored Procedure (T-SQL):
sql
CREATE PROCEDURE dbo.GetUserById
@UserId INT
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM dbo.Users WHERE Id = @UserId)
BEGIN
RAISERROR('User with ID %d not found', 16, 1, @UserId);
RETURN;
END
SELECT Id, Username, Email, CreatedAt
FROM dbo.Users
WHERE Id = @UserId;
END;
GOPostgreSQL 函数(PL/pgSQL):
sql
CREATE OR REPLACE FUNCTION get_user_by_id(p_user_id INTEGER)
RETURNS TABLE(id INTEGER, username VARCHAR, email VARCHAR, created_at TIMESTAMP)
LANGUAGE plpgsql
AS $$
BEGIN
RETURN QUERY
SELECT u.id, u.username, u.email, u.created_at
FROM users u
WHERE u.id = p_user_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'User with ID % not found', p_user_id
USING ERRCODE = 'P0002';
END IF;
END;
$$;MySQL 存储过程:
sql
DELIMITER //
CREATE PROCEDURE GetUserById(IN p_user_id INT)
BEGIN
DECLARE user_exists INT DEFAULT 0;
SELECT COUNT(*) INTO user_exists FROM users WHERE id = p_user_id;
IF user_exists = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'User not found';
END IF;
SELECT id, username, email, created_at
FROM users
WHERE id = p_user_id;
END //
DELIMITER ;SQL Server 存储过程(T-SQL):
sql
CREATE PROCEDURE dbo.GetUserById
@UserId INT
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM dbo.Users WHERE Id = @UserId)
BEGIN
RAISERROR('User with ID %d not found', 16, 1, @UserId);
RETURN;
END
SELECT Id, Username, Email, CreatedAt
FROM dbo.Users
WHERE Id = @UserId;
END;
GO3. Add Transaction Management
3. 添加事务管理
PostgreSQL with Transaction:
sql
CREATE OR REPLACE FUNCTION transfer_funds(
p_from_account INTEGER,
p_to_account INTEGER,
p_amount NUMERIC(15,2)
)
RETURNS BOOLEAN
LANGUAGE plpgsql
AS $$
BEGIN
-- Debit source account
UPDATE accounts SET balance = balance - p_amount
WHERE id = p_from_account AND balance >= p_amount;
IF NOT FOUND THEN
RAISE EXCEPTION 'Insufficient funds or invalid source account';
END IF;
-- Credit destination account
UPDATE accounts SET balance = balance + p_amount
WHERE id = p_to_account;
IF NOT FOUND THEN
RAISE EXCEPTION 'Invalid destination account';
END IF;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
$$;MySQL with Transaction:
sql
DELIMITER //
CREATE PROCEDURE TransferFunds(
IN p_from_account INT,
IN p_to_account INT,
IN p_amount DECIMAL(15,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
UPDATE accounts SET balance = balance - p_amount
WHERE id = p_from_account AND balance >= p_amount;
IF ROW_COUNT() = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Insufficient funds';
END IF;
UPDATE accounts SET balance = balance + p_amount
WHERE id = p_to_account;
COMMIT;
END //
DELIMITER ;PostgreSQL 事务版:
sql
CREATE OR REPLACE FUNCTION transfer_funds(
p_from_account INTEGER,
p_to_account INTEGER,
p_amount NUMERIC(15,2)
)
RETURNS BOOLEAN
LANGUAGE plpgsql
AS $$
BEGIN
-- Debit source account
UPDATE accounts SET balance = balance - p_amount
WHERE id = p_from_account AND balance >= p_amount;
IF NOT FOUND THEN
RAISE EXCEPTION 'Insufficient funds or invalid source account';
END IF;
-- Credit destination account
UPDATE accounts SET balance = balance + p_amount
WHERE id = p_to_account;
IF NOT FOUND THEN
RAISE EXCEPTION 'Invalid destination account';
END IF;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
$$;MySQL 事务版:
sql
DELIMITER //
CREATE PROCEDURE TransferFunds(
IN p_from_account INT,
IN p_to_account INT,
IN p_amount DECIMAL(15,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
UPDATE accounts SET balance = balance - p_amount
WHERE id = p_from_account AND balance >= p_amount;
IF ROW_COUNT() = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Insufficient funds';
END IF;
UPDATE accounts SET balance = balance + p_amount
WHERE id = p_to_account;
COMMIT;
END //
DELIMITER ;4. Validate Syntax
4. 验证语法
Use the validation script to check procedure syntax:
bash
undefined使用验证脚本检查存储过程语法:
bash
undefinedValidate PostgreSQL procedure
Validate PostgreSQL procedure
python3 {baseDir}/scripts/stored_procedure_syntax_validator.py
--db-type postgresql
--file procedure.sql
--db-type postgresql
--file procedure.sql
python3 {baseDir}/scripts/stored_procedure_syntax_validator.py
--db-type postgresql
--file procedure.sql
--db-type postgresql
--file procedure.sql
Validate MySQL procedure
Validate MySQL procedure
python3 {baseDir}/scripts/stored_procedure_syntax_validator.py
--db-type mysql
--file procedure.sql
--db-type mysql
--file procedure.sql
undefinedpython3 {baseDir}/scripts/stored_procedure_syntax_validator.py
--db-type mysql
--file procedure.sql
--db-type mysql
--file procedure.sql
undefined5. Deploy to Database
5. 部署到数据库
bash
undefinedbash
undefinedDeploy to PostgreSQL
Deploy to PostgreSQL
python3 {baseDir}/scripts/stored_procedure_deployer.py
--db-type postgresql
--host localhost
--database mydb
--file procedure.sql
--db-type postgresql
--host localhost
--database mydb
--file procedure.sql
python3 {baseDir}/scripts/stored_procedure_deployer.py
--db-type postgresql
--host localhost
--database mydb
--file procedure.sql
--db-type postgresql
--host localhost
--database mydb
--file procedure.sql
Deploy to MySQL
Deploy to MySQL
python3 {baseDir}/scripts/stored_procedure_deployer.py
--db-type mysql
--host localhost
--database mydb
--file procedure.sql
--db-type mysql
--host localhost
--database mydb
--file procedure.sql
undefinedpython3 {baseDir}/scripts/stored_procedure_deployer.py
--db-type mysql
--host localhost
--database mydb
--file procedure.sql
--db-type mysql
--host localhost
--database mydb
--file procedure.sql
undefinedOutput
输出结果
- SQL procedure file with proper syntax for target database
- Validation report confirming syntax correctness
- Deployment confirmation with execution results
- Rollback script for procedure removal
- 符合目标数据库语法的SQL存储过程文件
- 确认语法正确性的验证报告
- 包含执行结果的部署确认信息
- 用于移除存储过程的回滚脚本
Error Handling
错误处理
| Error | Cause | Solution |
|---|---|---|
| Missing CREATE PROCEDURE privilege | |
| Invalid SQL for database type | Use database-specific syntax validator |
| Procedure exists without OR REPLACE | Add |
| Referenced column doesn't exist | Verify table schema before deployment |
| Error during transaction | Check EXCEPTION handler and ROLLBACK logic |
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 缺少CREATE PROCEDURE权限 | |
| 数据库类型对应的SQL无效 | 使用数据库专属语法验证工具 |
| 存储过程已存在且未使用OR REPLACE | 添加 |
| 引用的列不存在 | 部署前验证表结构 |
| 事务执行过程中出错 | 检查异常处理程序和回滚逻辑 |
Examples
示例
Generate CRUD procedures for a table:
User: Generate CRUD stored procedures for the 'products' table in PostgreSQL
Claude: I'll create four procedures for the products table:
1. create_product - Insert new product
2. get_product - Retrieve by ID
3. update_product - Update existing product
4. delete_product - Soft delete productCreate audit trigger:
User: Create a trigger to log all changes to the orders table
Claude: I'll create an audit trigger that:
1. Creates an orders_audit table if not exists
2. Captures INSERT, UPDATE, DELETE operations
3. Records old/new values, user, and timestamp为表生成CRUD存储过程:
用户:为PostgreSQL中的'products'表生成CRUD存储过程
Claude:我将为products表创建四个存储过程:
1. create_product - 插入新产品
2. get_product - 根据ID查询产品
3. update_product - 更新现有产品
4. delete_product - 软删除产品创建审计触发器:
用户:创建一个触发器来记录orders表的所有变更
Claude:我将创建一个审计触发器,具备以下功能:
1. 若不存在则创建orders_audit表
2. 捕获INSERT、UPDATE、DELETE操作
3. 记录新旧值、用户和时间戳Resources
参考资源
{baseDir}/references/postgresql_stored_procedure_best_practices.md{baseDir}/references/mysql_stored_procedure_best_practices.md{baseDir}/references/sqlserver_stored_procedure_best_practices.md{baseDir}/references/database_security_guidelines.md{baseDir}/references/stored_procedure_optimization_techniques.md
{baseDir}/references/postgresql_stored_procedure_best_practices.md{baseDir}/references/mysql_stored_procedure_best_practices.md{baseDir}/references/sqlserver_stored_procedure_best_practices.md{baseDir}/references/database_security_guidelines.md{baseDir}/references/stored_procedure_optimization_techniques.md