การแทรก Teradata นับเป็นตัวแปร

คำอธิบายสิ่งที่ฉันพยายามทำ:

ฉันมี 2 สภาพแวดล้อม อันหนึ่งมีข้อมูล (X) อันที่สองไม่มีข้อมูล (Y)

ฉันได้ทำขั้นตอนซึ่งมีพารามิเตอร์อินพุต P_TableName แล้ว ควรตรวจสอบว่าในตารางนี้มีข้อมูลใดๆ หรือไม่ และถ้ามี เราจะนำข้อมูลไปยังสภาพแวดล้อม Y

ส่วนใหญ่มันใช้งานได้ แต่ฉันมีปัญหากับสิ่งง่ายๆ อย่างหนึ่ง (ฉันไม่ค่อยมีประสบการณ์ใน TD มากนัก แต่ใน Oracle จะใช้เวลา 10 วินาที)

ฉันต้องส่ง select count(*) จาก X ไปยังตัวแปรต้องทำอย่างไร?

ฉันพยายามโดย SET VAR = SELECT... INSERT INTO VAR SELECT... ฉันกำลังพยายามสร้างตัวแปรสำหรับคำสั่งที่กำลังดำเนินการโดยตรง

        SET v_sql_stmt = 'INSERT INTO ' || VAR|| ' SELECT COUNT(*) FROM ' || P_TableName;
        CALL DBC.SYSEXECSQL(v_sql_stmt);

อาจเป็นเรื่องง่ายจริงๆ แต่ฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีสำหรับสิ่งนั้นได้ กรุณาช่วย


person Emwi    schedule 07.02.2018    source แหล่งที่มา


คำตอบ (2)


คุณจะต้องเปิดเคอร์เซอร์เพื่อดึงผลลัพธ์เนื่องจากคุณใช้งาน Dynamic SQL มีตัวอย่างที่ดีอยู่ใน เอกสารช่วยเหลือ Teradata บน Dynamic SQL:

CREATE PROCEDURE GetEmployeeSalary
(IN EmpName VARCHAR(100), OUT Salary DEC(10,2))
BEGIN
  DECLARE SqlStr VARCHAR(1000);
  DECLARE C1 CURSOR FOR S1;
  SET SqlStr = 'SELECT Salary FROM EmployeeTable WHERE EmpName = ?';
  PREPARE S1 FROM SqlStr;
  OPEN C1 USING EmpName;
  FETCH C1 INTO Salary;
  CLOSE C1;
END;
person JNevill    schedule 07.02.2018

คุณไม่สามารถใช้ INTO ใน Dynamic SQL ใน Teradata

วิธีแก้ปัญหา คุณต้องใช้เคอร์เซอร์ส่งคืนแถวเดียว:

DECLARE cnt BIGINT;
DECLARE cnt_cursor CURSOR FOR S;
SET v_sql_stmt = ' SELECT COUNT(*) FROM ' || P_TableName;
PREPARE S FROM v_sql_stmt;
OPEN cnt_cursor;
FETCH cnt_cursor INTO cnt; 
CLOSE cnt_cursor;
person dnoeth    schedule 07.02.2018