在HANA SQL中执行动态SQL时出错

2020-09-10 18:38发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我的代码如下所示。

步骤" b.c ..."(IN ID INTEGER,IN btch_id NVARCHAR(255))

语言SQLSCRIPT

SQL安全调用程序

--DEFAULT SCHEMA <默认模式名称>

-开始读取SQL数据/*****************************************

编写过程逻辑****************************************/

DECLARE i整数= 0;

DECLARE col NVARCHAR(2550)='COL_1';

DECLARE标识符NVARCHAR(255)='';

DECLARE oIncr INTEGER;

DECLARE Countofrec整数;

DECLARE PRECOLUMNLIST NVARCHAR(2000);

SELECT COUNT(*)INTO Countofrec FROM(select ........);

对于我来说1 ..:Countofrec DO

oIncr =:i + 1;

标识符= CONCAT('COL_',:oIncr);

SELECT CONCAT(CONCAT(:col,','),:identifier)从" DUMMY"转换为col;

IF:oIncr =:Countofrec然后中断;

END IF;

END FOR;

PRECOLUMNLIST =('a,b,c,d');

立即执行('SELECT'||:PRECOLUMNLIST ||','||:col ||'FROM" table" WHATE BATCH_ID'||'='||::btch_id);

END

错误:

错误:(dberror)[1288]:表达式不能用作分配目标:'15536​​24925331'

" 15536​​24925331"是我通过的输入值

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我的代码如下所示。

步骤" b.c ..."(IN ID INTEGER,IN btch_id NVARCHAR(255))

语言SQLSCRIPT

SQL安全调用程序

--DEFAULT SCHEMA <默认模式名称>

-开始读取SQL数据/*****************************************

编写过程逻辑****************************************/

DECLARE i整数= 0;

DECLARE col NVARCHAR(2550)='COL_1';

DECLARE标识符NVARCHAR(255)='';

DECLARE oIncr INTEGER;

DECLARE Countofrec整数;

DECLARE PRECOLUMNLIST NVARCHAR(2000);

SELECT COUNT(*)INTO Countofrec FROM(select ........);

对于我来说1 ..:Countofrec DO

oIncr =:i + 1;

标识符= CONCAT('COL_',:oIncr);

SELECT CONCAT(CONCAT(:col,','),:identifier)从" DUMMY"转换为col;

IF:oIncr =:Countofrec然后中断;

END IF;

END FOR;

PRECOLUMNLIST =('a,b,c,d');

立即执行('SELECT'||:PRECOLUMNLIST ||','||:col ||'FROM" table" WHATE BATCH_ID'||'='||::btch_id);

END

错误:

错误:(dberror)[1288]:表达式不能用作分配目标:'15536​​24925331'

" 15536​​24925331"是我通过的输入值

付费偷看设置
发送
1条回答
骆驼绵羊
1楼-- · 2020-09-10 19:10

在使用动态sql时,我做了几件事,发现对故障排除有帮助。

第一个只是构建语句字符串时的格式化内容,我将每个元素放在自己的行上。 这样可以避免眼睛疲劳解析较长的线条; 可以更容易地看到每个带引号的字符串都具有开始和结束引号,并且每个串联运算符都正确键入。 即代替

立即执行('SELECT'||:PRECOLUMNLIST ||','||:col ||'FROM" TABLE" WHATE BATCH_ID'||'='||:btch_id);

我会改写为

立即执行(
'SELECT'
||::PRECOLUMNLIST
||','
||:col
|| 'FROM" table" WHERE BATCH_ID'
||'='<----一行中两个带引号的字符串可以合并
||:btch_id
);

第二个建议是声明一个变量以保存构造的SQL语句,以便在开发过程中可以打印出来以验证该语句正确无误,并在传递给EXECUTE进行执行之前希望得到期望的结果。 您可以在满足所有条件的情况下简单地注释掉打印语句,然后将其保留在那里以备将来调试。 (我假设HANA的EXECUTE IMMEDIATE可以接受变量;我的经验是使用Adaptive Server。)

干杯,
-bret

一周热门 更多>