SAP HANA 存储过程中的动态 SQL
Dynamic SQL in SAP HANA Stored Procedures
我想在 HANA 中创建一个存储过程,它执行以下操作:
- 接受 Table 类型的 IN 参数。
- 接受另一个 varchar 类型的 IN 参数。
- 根据第一个输入参数的列值过滤现有 table 中的一些行。
- 尝试根据第二个输入参数给定的条件对行进行排序 (ORDER BY)。
这是我要创建的存储过程
CREATE PROCEDURE DEMO_PROD_EXAMPLE_DYNAMIC(IN TEMPLIST PRODLISTTYPE,IN ORDERSTRING VARCHAR(200))
AS
BEGIN
OUTVAR = SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
SELECT * FROM :OUTVAR ORDER BY :ORDERSTRING DESC;
END;
我面临以下障碍:
- 在上面的过程中,根本没有发生排序!如果我对列名进行硬编码,例如 SELECT * FROM :OUTVAR ORDER BY ID DESC;有效。
- 如果我尝试创建动态 SQL 查询,例如 SELECT * FROM'|| :OUTVAR||'按 '||:ORDERSTRING||'DESC' 排序;我得到一个例外,不允许将 varchar 和 table 类型与连接运算符一起使用。
如何在 HANA 中根据动态条件(传递给过程的 name/s 列)对结果集进行排序。
TIA
您必须使用 EXECUTE IMMEDIATE 来执行动态 SQL 语句:
EXECUTE IMMEDIATE 'SELECT NAME FROM DEMO_PRODS ' || :ORDERSTRING || ' DESC';
但是,对于动态 SQL,您不能将 table 类型的变量用于 select。所以你需要为 SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
找到另一个解决方案。使用 global temporary table 是一个:
INSERT INTO TEMPORARY_TABLE (SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
EXECUTE IMMEDIATE 'SELECT NAME FROM TEMPORARY_TABLE ' || :ORDERSTRING || ' DESC';
我想在 HANA 中创建一个存储过程,它执行以下操作:
- 接受 Table 类型的 IN 参数。
- 接受另一个 varchar 类型的 IN 参数。
- 根据第一个输入参数的列值过滤现有 table 中的一些行。
- 尝试根据第二个输入参数给定的条件对行进行排序 (ORDER BY)。
这是我要创建的存储过程
CREATE PROCEDURE DEMO_PROD_EXAMPLE_DYNAMIC(IN TEMPLIST PRODLISTTYPE,IN ORDERSTRING VARCHAR(200))
AS
BEGIN
OUTVAR = SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
SELECT * FROM :OUTVAR ORDER BY :ORDERSTRING DESC;
END;
我面临以下障碍:
- 在上面的过程中,根本没有发生排序!如果我对列名进行硬编码,例如 SELECT * FROM :OUTVAR ORDER BY ID DESC;有效。
- 如果我尝试创建动态 SQL 查询,例如 SELECT * FROM'|| :OUTVAR||'按 '||:ORDERSTRING||'DESC' 排序;我得到一个例外,不允许将 varchar 和 table 类型与连接运算符一起使用。
如何在 HANA 中根据动态条件(传递给过程的 name/s 列)对结果集进行排序。
TIA
您必须使用 EXECUTE IMMEDIATE 来执行动态 SQL 语句:
EXECUTE IMMEDIATE 'SELECT NAME FROM DEMO_PRODS ' || :ORDERSTRING || ' DESC';
但是,对于动态 SQL,您不能将 table 类型的变量用于 select。所以你需要为 SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
找到另一个解决方案。使用 global temporary table 是一个:
INSERT INTO TEMPORARY_TABLE (SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
EXECUTE IMMEDIATE 'SELECT NAME FROM TEMPORARY_TABLE ' || :ORDERSTRING || ' DESC';