从firebird到mysql的存储过程移植

yftpprvb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(414)

这个问题在这里已经有答案了

将int转换为varchar(8个答案)
两年前关门了。
我是mysql新手,我正在尝试将一个sql存储过程代码从firebird移植到mysql。我尽了最大努力,但仍在concat语句行上生成错误。
代码如下:

  1. CREATE PROCEDURE BUILD_MATRIX(IN RECURSIVECOLLECTION VarChar(1), collectionID Integer)
  2. BEGIN
  3. declare collectionsort varchar(255);
  4. declare zotero_itemid integer;
  5. declare itemcount integer;
  6. declare countlinks integer;
  7. declare totals varchar(150);
  8. declare acollectionid integer;
  9. declare acollectionsort varchar(255);
  10. declare azotero_itemid integer;
  11. declare amodalityid integer;
  12. declare atagid integer;
  13. declare aname varchar(255);
  14. declare bcollectionid integer;
  15. declare bcollectionsort varchar(255);
  16. declare bzotero_itemid integer;
  17. declare bmodalityid integer;
  18. declare btagid integer;
  19. declare bname varchar(255);
  20. IF (RecursiveCollection = '1') THEN /* Recursive Collections Enabled */
  21. SET collectionSort = CONCAT('[',CAST(collectionID AS varchar(255)) , ']');
  22. WHILE
  23. Select zotero_itemID, count(zotero_itemID) As ItemCount
  24. From factors
  25. WHERE POSITION(collectionSort IN :collectionSort) <> 0 GROUP BY zotero_itemID
  26. INTO :zotero_itemID, :ItemCount
  27. DO
  28. IF (ItemCount > 1) THEN
  29. WHILE
  30. Select a.collectionID as acollectionID, a.collectionSort as acollectionSort, a.zotero_itemID as azotero_itemID, a.modalityID as amodalityID, a.tagID as atagID, a.name as aname,
  31. b.collectionID as bcollectionID, b.collectionSort as bcollectionSort, b.zotero_itemID as bzotero_itemID, b.modalityID as bmodalityID, b.tagID as btagID, b.name as bname
  32. From factors a
  33. JOIN factors b On a.modalityID <= b.modalityID
  34. WHERE (a.modalityID > 0 AND b.modalityID > 0) AND (a.tagID <> b.tagID) AND (POSITION(a.collectionSort IN :collectionSort) <> 0) And (a.zotero_itemID = :zotero_itemID) And (POSITION(b.collectionSort IN :collectionSort) <> 0) And (b.zotero_itemID = :zotero_itemID)
  35. ORDER BY a.modalityID
  36. INTO :ACOLLECTIONID, :ACOLLECTIONSORT, :AZOTERO_ITEMID, :amodalityID, :atagID, :ANAME, :BCOLLECTIONID, :BCOLLECTIONSORT, :BZOTERO_ITEMID, :bmodalityID, :btagID, :BNAME
  37. DO
  38. /* Verify if there are links with the same normative-determinative modalities and factors to avoid duplications */
  39. SELECT count(linkID) as countLinks
  40. FROM matrix
  41. WHERE collectionID = :collectionID And recursiveCollection = :recursiveCollection AND normativeModality = :amodalityID AND normativeFactorID = :atagID And determinativeModality = :bmodalityID AND determinativeFactorID = :btagID
  42. INTO :countLinks;
  43. IF (countLinks > 0) THEN
  44. /* Set synchronized = True only. To avoid duplications */
  45. SELECT totals
  46. FROM get_total_items(:atagid, :btagID, :recursivecollection, :collectionID)
  47. INTO totals;
  48. UPDATE matrix
  49. SET totals = :totals, synchronized = '1'
  50. WHERE collectionID = :collectionID AND recursiveCollection = :recursiveCollection AND normativeModality = :amodalityID AND normativeFactorID = :atagID And determinativeModality = :bmodalityID AND determinativeFactorID = :btagID;
  51. ELSE
  52. /* Add only new links and ignore similar combinations like A-B and B-A if the table Matrix already has one */
  53. SELECT count(linkID) as countLinks
  54. FROM matrix
  55. WHERE collectionID = :collectionID AND recursiveCollection = :recursiveCollection AND normativeModality = :amodalityID AND normativeFactorID = :btagID And determinativeModality = :bmodalityID AND determinativeFactorID = :atagID
  56. INTO :countLinks;
  57. IF (countLinks = 0) THEN
  58. SELECT totals
  59. FROM get_total_items(:atagid, :btagID, :recursivecollection, :collectionID)
  60. INTO totals;
  61. INSERT INTO matrix (collectionID,normativeModality,normativeFactorID,determinativeModality,determinativeFactorID, totals, synchronized, recursiveCollection)
  62. VALUES (:collectionID,:amodalityID,:atagID,:bmodalityID,:btagID, :totals, '1', :recursiveCollection);
  63. END IF;
  64. END IF;
  65. END WHILE;
  66. END IF;
  67. END WHILE;
  68. ELSE IF (RecursiveCollection = '0') THEN /* One Collection Only */
  69. WHILE
  70. Select zotero_itemID, count(zotero_itemID) As ItemCount
  71. From factors
  72. WHERE collectionID = :collectionID GROUP BY zotero_itemID
  73. INTO :zotero_itemID, :ItemCount
  74. DO
  75. IF (ItemCount > 1) THEN
  76. WHILE
  77. Select a.collectionID as acollectionID, a.collectionSort as acollectionSort, a.zotero_itemID as azotero_itemID, a.modalityID as amodalityID, a.tagID as atagID, a.name as aname,
  78. b.collectionID as bcollectionID, b.collectionSort as bcollectionSort, b.zotero_itemID as bzotero_itemID, b.modalityID as bmodalityID, b.tagID as btagID, b.name as bname
  79. From factors a
  80. JOIN factors b On a.modalityID <= b.modalityID
  81. WHERE (a.modalityID > 0 AND b.modalityID > 0) AND (a.tagID <> b.tagID) AND (a.collectionID = :collectionID) And (a.zotero_itemID = :zotero_ItemID) And (b.collectionID = :collectionID) And (b.zotero_itemID = :zotero_ItemID)
  82. ORDER BY a.modalityID
  83. INTO :ACOLLECTIONID, :ACOLLECTIONSORT, :AZOTERO_ITEMID, :amodalityID, :atagID, :ANAME, :BCOLLECTIONID, :BCOLLECTIONSORT, :BZOTERO_ITEMID, :bmodalityID, :btagID, :BNAME
  84. DO
  85. /* Verify if there are links with the same normative-determinative modalities and factors to avoid duplications */
  86. SELECT count(linkID) as countLinks
  87. FROM matrix
  88. WHERE collectionID = :collectionID And recursiveCollection = :recursiveCollection AND normativeModality = :amodalityID AND normativeFactorID = :atagID And determinativeModality = :bmodalityID AND determinativeFactorID = :btagID
  89. INTO :countLinks;
  90. IF (countLinks > 0) THEN
  91. /* Set synchronized = True only. To avoid duplications */
  92. SELECT totals
  93. FROM get_total_items(:atagid, :btagID, :recursivecollection, :collectionID)
  94. INTO totals;
  95. UPDATE matrix
  96. SET totals = :totals, synchronized = '1'
  97. WHERE collectionID = :collectionID AND recursiveCollection = :recursiveCollection AND normativeModality = :amodalityID AND normativeFactorID = :atagID And determinativeModality = :bmodalityID AND determinativeFactorID = :btagID;
  98. ELSE
  99. /* Add only new links and ignore similar combinations like A-B and B-A if the table Matrix already has one */
  100. SELECT count(linkID) as countLinks
  101. FROM matrix
  102. WHERE collectionID = :collectionID AND recursiveCollection = :recursiveCollection AND normativeModality = :amodalityID AND normativeFactorID = :btagID And determinativeModality = :bmodalityID AND determinativeFactorID = :atagID
  103. INTO :countLinks;
  104. IF (countLinks = 0) THEN
  105. SELECT totals
  106. FROM get_total_items(:atagid, :btagID, :recursivecollection, :collectionID)
  107. INTO totals;
  108. INSERT INTO matrix (collectionID,normativeModality,normativeFactorID,determinativeModality,determinativeFactorID, totals, synchronized, recursiveCollection)
  109. VALUES (:collectionID,:amodalityID,:atagID,:bmodalityID,:btagID, :totals, '1', :recursiveCollection);
  110. END IF;
  111. END IF;
  112. END WHILE;
  113. END IF;
  114. END WHILE;
  115. END IF;
  116. /* Delete all rows that where not updated. It means that all rows with synchronized fields set 0 aren't present at Zotero anymore. */
  117. DELETE FROM matrix
  118. WHERE collectionID = :collectionID AND recursiveCollection = :recursiveCollection AND synchronized = '0';
  119. /* Set all rows updated and added to synchronized = 0 */
  120. UPDATE matrix
  121. SET synchronized = '0'
  122. WHERE collectionID = :collectionID AND recursiveCollection = :recursiveCollection AND synchronized = '1';
  123. SUSPEND;
  124. END

当我尝试运行时,收到以下消息:
错误代码:1064。sql语法有错误;请查看与您的mysql服务器版本对应的手册,以了解使用near'('[',cast(collectionid as varchar(255)),'])作为collectionsort的正确语法;在22号线的时候
你能帮帮我吗?

1u4esq0p

1u4esq0p1#

取下铸件。只需使用集合id。

相关问题