我需要为类创建一个过程,但我认为本书中的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 ;
答案 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手册中的函数和运算符列表,看看他们是否最近添加了这个函数,但是没有在那里找到它。