จะลบโพรซีเดอร์ที่ชื่อคลุมเครือได้อย่างไร?


12

ฉันกำลังใช้ informix ...

ฉันไม่รู้ว่าฉันทำได้อย่างไร แต่มีสองขั้นตอนที่มีชื่อเดียวกันในฐานข้อมูลของฉัน เมื่อฉันพยายามที่จะลบพวกเขาด้วย

DROP PROCEDURE myProc;

จากนั้นฉันได้รับข้อความแสดงข้อผิดพลาด

ERROR: Routine (add_adr_trigger_row) ambiguous - more than one
routine resolves to given signature.
Error Code: -9700

ฉันจะวางขั้นตอนได้อย่างไร

คำตอบ:


13

สิ่งนี้จะเกิดขึ้นเมื่อคุณมี 2 โพรซีเดอร์หรือมากกว่านั้นที่มีชื่อเดียวกัน แต่มีพารามิเตอร์อินพุตจำนวนต่างกัน

ตัวอย่างเช่นคุณได้สร้าง 2 ขั้นตอน:

CREATE PROCEDURE myProc(param1)
...
CREATE PROCEDURE myProc(param1, param2)
...

ในการลบอันที่สองคุณมี 2 ตัวเลือก:

ง่าย ๆ :

DROP PROCEDURE myProc(param1, param2);

หนึ่งยาก:

dbaccess DB -
select procname, procid, numargs from sysprocedures where procname like 'myProc';
procname  myProc
procid    1
numargs   1

procname  myProc
procid    2
**numargs   2**

UPDATE sysprocedures SET procname='myProcOLD' WHERE procid=2;
DROP PROCEDURE myProcOLD;

แม้ว่าวิธีแรกจะง่ายตาย แต่ครั้งแรกที่ฉันได้รับเรียกกลางดึกสำหรับปัญหาเดียวกันนี้ฉันได้เลือกวิธีที่สอง ความผิดฉันเอง ...


นอกจากนี้คุณสามารถใช้ "finderr 9700" ในคอนโซล ssh ของคุณเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดประเภทนี้ ข้อมูลมักจะเป็นประโยชน์อย่างมาก: ... ปัญหานี้เกิดขึ้นเมื่อมีการโต้แย้ง (หรือประเภทที่มาหรือประเภทผู้ปกครอง) ได้ปลดเปลื้องไปยังพารามิเตอร์ของสองหรือมากกว่ากิจวัตร ตัวอย่างเช่นสมมติว่ามีรูทีนสองรายการที่เรียกว่า rout_name (paramtype1) และ rout_name (paramtype2) และชุดคำสั่งจะเรียกใช้ด้วย rout_name (argtype) นอกจากนี้ยังมีการปลดเปลื้องโดยนัยจาก argtype ถึง paramtype1 และ argtype ถึง paramtype2 ในกรณีนี้เกิดข้อผิดพลาดนี้ขึ้น
MTIhai

Peter @MTIhai ถ้านี่เป็นวิธีแก้ปัญหาเราจะย้ายมันไปหาคำตอบได้ไหม?
jcolebrand

0

หากคุณทราบว่านี่อาจเป็นปัญหาในอนาคตคุณสามารถสร้างขั้นตอนของคุณด้วยชื่อเฉพาะซึ่งจะต้องไม่ซ้ำกันในทุกขั้นตอนในฐานข้อมูล

หากคุณไม่ทราบว่าจะเป็นปัญหาเมื่อคุณสร้างขั้นตอนคุณจะไม่สามารถย้อนกลับและเพิ่มชื่ออย่างเป็นทางการได้และคุณมีปัญหา

UPDATE จากsysproceduresในคำตอบที่เลือกควรทำงานเฉพาะเมื่อผู้ใช้เชื่อมต่อเป็นinformix(หรือในกรณีของเซิร์ฟเวอร์ส่วนตัวเจ้าของเซิร์ฟเวอร์)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.