เกิดอะไรขึ้นกับขั้นตอนการจัดเก็บนี้?

ใกล้จะถึงการรันโพรซีเดอร์ที่เก็บไว้ครั้งแรกของฉันแล้ว อันนี้คอมไพล์ แต่เมื่อฉันรันด้วย call test.fttest5('YEAR'); มันจะเกิดข้อผิดพลาด

สถานะ SQL: 22001 รหัสผู้จำหน่าย: -303 ข้อความ: [SQL0303] ตัวแปรโฮสต์ *N เข้ากันไม่ได้ สาเหตุ . . . . . : ไม่สามารถดำเนินการ FETCH, SELECT, CALL, SET, VALUES INTO, GET DIAGNOSTICS, GET DESCRIPTOR หรือ SET DESCRIPTOR ได้เนื่องจากประเภทข้อมูลของตัวแปรโฮสต์ *N เข้ากันไม่ได้กับประเภทข้อมูลของรายการที่เกี่ยวข้อง

นอกจากนี้ ฉันจะระบุประเภทข้อมูลไม่จำกัดในขั้นตอนการจัดเก็บของฉันได้อย่างไร ฉันพยายาม DECLARE temp VARCHAR(MAX); แต่ไม่ได้ผล แพลตฟอร์มของฉันคือ ISeries DB2 V5R4

create procedure test.fttest5
    (IN ftExpression CHARACTER(30))
    language sql
    reads sql data
    dynamic result sets 1
    begin

    declare cmd VARCHAR(50);
    declare whr VARCHAR(50)
;

    declare x cursor for sl;
    set cmd='select * from testSchema.tempTable' ;
    if ftExpression IS NOT NULL
 THEN
     set whr= ftExpression;
    END IF;

    set cmd=cmd || CASE WHEN whr IS NULL THEN '' ELSE ' ORDER BY ' || whr END;  
    prepare sl from cmd;
    open x;
    return;
    end
    ;

person Zo Has    schedule 19.07.2010    source แหล่งที่มา


คำตอบ (2)


ฉันเชื่อว่าข้อผิดพลาดที่คุณได้รับที่นี่เกิดขึ้นจริงก่อนที่ขั้นตอนของคุณจะถูกเรียกใช้ด้วยซ้ำ คุณมีขั้นตอนที่กำหนดด้วยพารามิเตอร์ที่เป็น CHAR แต่คุณกำลังเรียกมันด้วย VARCHAR เมื่อคุณพิมพ์ SQL แบบโต้ตอบเหมือนกับว่าพารามิเตอร์นั้นเข้ามาในรูปแบบ VARCHAR

ลองเรียกมันว่า: call test.fttest5(CHAR('YEAR'))

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

อย่างไรก็ตาม ฉันคิดว่าคุณขาดบรรทัด SET RESULT SETS CURSOR x นอกจากนี้ฉันจะเตรียมการไว้ก่อนการประกาศเนื่องจากฉันคิดว่าคำสั่งอาจมีความสำคัญ

เอกสารประกอบของ IBM อยู่ที่ http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/rzaikspresultsets.htm

person Brandon Peterson    schedule 19.07.2010
comment
ขอบคุณ ฉันจะตรวจสอบสิ่งที่คุณพูดและตั้งกระทู้นี้ไว้! - person Zo Has; 19.07.2010

การเลือก * ไม่ถูกต้อง โดยเฉพาะหากคุณเลือกจากมุมมองที่ซับซ้อนหรือใหญ่

เคอร์เซอร์โดยทั่วไปไม่ดีเพราะคุณวนซ้ำแต่ละแถว แทนที่จะทำงานกับเซต

ลองคิดดูด้วยว่าจำเป็นต้องมี Dynamic SQL ที่นี่หรือไม่?

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

person Community    schedule 19.07.2010
comment
ขอบคุณสำหรับการตอบกลับ นี่เป็นเพียงคำสั่งตัวอย่างและขั้นตอนการทดสอบ สถานการณ์จริงเป็นไดนามิกของคำสั่ง Where สำหรับตัวกรองแบบยาวและคำค้นหา (DYNAMIC WHERE & ORDER BY) ตอนนี้ฉันรู้แค่ว่าฉันต้องใช้เคอร์เซอร์เพื่อให้ Stored Procedure ของฉันทำงาน คุณช่วยแสดงวิธีใช้ชุดกับตัวอย่างของฉันได้ไหม - person Zo Has; 19.07.2010