在SQL中创建过程很难

时间:2016-11-25 17:51:03

标签: mysql sql

我需要为类创建一个过程,但我认为本书中的sql版本非常旧。例如,我认为我无法使用"创建或替换"就像这本书所说,但是"创建"," drop","创建",但这超出了范围。

我的问题是我在设置%TYPE时遇到问题。我使用WAMP,我在Notepad ++中创建了该过程,并将其粘贴到控制台。然后我打开phpmyadmin,将其粘贴到查询窗口中,并获得更详细的错误消息。书:" SQL指南"作者:Phil Pratt和Mary Last,第九版https://www.amazon.com/Guide-SQL-Philip-J-Pratt/dp/111152727X。本书有TAL Distributers,SOLARIS comdominium group和COLONIAL冒险之旅数据库,可以帮助任何人。教师提供了sql文件来创建数据库作为节省时间。这是最后一章,第8章创建代码:

delimiter ;;
use tal;;
CREATE PROCEDURE CHANGE_ITEM_PRICE(I_ITEM_NUM IN item.item_num%TYPE, I_NEW_PRICE IN item.price%TYPE) AS
BEGIN
UPDATE item SET price = I_NEW_PRICE
WHERE item_num = I_ITEM_NUM;
END;;
delimiter ;

2个错误:

Unrecognized data type. (near "IN" at position 56)

和另一个91位。

有什么想法?我不想在这里吃勺子,我只需要一点指导。

编辑:谢谢@Bill Karwin。更正的工作语法如下:

delimiter ;;
use tal;;
CREATE PROCEDURE CHANGE_ITEM_PRICE(IN I_ITEM_NUM char(4), IN I_NEW_PRICE decimal(6,2))
BEGIN
UPDATE item SET price = I_NEW_PRICE
WHERE item_num = I_ITEM_NUM;
END;;
delimiter ;

2 个答案:

答案 0 :(得分:3)

I_ITEM_NUM IN item.item_num%TYPE

这不是MySQL的有效过程参数声明。您必须使用INT或DATE或VARCHAR( length )或其他已知类型命名类型。 MySQL没有像您所示的语法来动态查询命名列的类型。

出于好奇,你在哪里获得了这种语法?它是其他品牌SQL数据库的一部分吗?我以前从未见过它。

啊哈,我找到了:

https://www.postgresql.org/docs/current/static/sql-createfunction.html说:

  

通过编写table_name.column_name%TYPE来引用列的类型。使用此功能有时可以帮助使函数独立于对表的定义的更改。

这是PostgreSQL文档中的内容。 PostgreSQL和MySQL不是同一个软件,并且有许多语法和功能的例子,每个都有另一个没有。

Oracle也支持这种语法:%TYPE attribute。实际上,我假设Oracle在PostgreSQL之前做过它。

重新评论:

  

var IN char(4)“无效

你说你对一点指导感兴趣。最简单的指导是,当您学习新语法时,阅读参考文档会有所帮助。 : - )

在过去的16年里,我经常使用MySQL。我经常在MySQL会议和用户组发表演讲。我是published author。甚至当我做一些我不熟悉的事情时,我打开文档页面作为第一步。

此处:http://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

请注意,在声明过程参数时,它是IN param_name type,而不是param_name IN type

  

现在错误是“AS ......附近的语法”

再次参考文档。 MySQL的存储过程语法中没有AS。这也是Oracle语法。

如果你打算使用MySQL而不是Oracle,你可能需要另外一本书。例如,我建议MySQL Stored Procedure Programming: Building High-Performance Web Applications in MySQL

但老实说,我根本不喜欢在MySQL中使用存储过程。 MySQL的存储过程实现远不如Oracle。 MySQL程序没有包或库,没有程序调试器,它们没有编译,并且它们不能很好地扩展。

大多数使用MySQL的开发人员在他们的应用程序代码而不是存储过程中放置​​了更多逻辑。这允许他们将性能扩展到众多应用程序服务器,而不是堆积数据库服务器上的负载。

答案 1 :(得分:2)

我不相信MySQL与Oracle的%TYPE运营商相当。您需要直接指定数据类型,例如:

CREATE PROCEDURE CHANGE_ITEM_PRICE(I_ITEM_NUM INT, I_NEW_PRICE DECIMAL) ...

我查看了最新的MySQL手册中的函数和运算符列表,看看他们是否最近添加了这个函数,但是没有在那里找到它。