如何通过Web nodeJS调用调试SAP HANA XSA存储过程-问题传递参数

2020-09-05 13:33发布

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

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


我们正在尝试调试从HANA上的NodeJS调用的存储过程。 我们可以调试存储过程,并且当通过UI选项尝试该过程时,该过程运行良好。 但是,当我们想通过web/nodeJS调用调试存储过程时,就会遇到问题。 我们可以毫无问题地调试NodeJS代码,但看不到传递给我们节点代码的变量:

这是我们的节点代码:

 app.get("/img/getEmployeesUsingStoredProcedure",函数(要求,要求){


 var client = req.db;
 var EMPLOYEE_ID = req.query.EMPLOYEE_ID;
 var LAST_NAME = req.query.LAST_NAME;
 var FIRST_NAME = req.query.FIRST_NAME;

 client.prepare(
 '调用" SAP_AD_HDB_1"。" getEmployeeDetails"(?,?,?,?)',
 函数(错误,声明){
 如果(err){res.type(" text/plain")。status(500).send(" ERROR:" + err.toString());
 返回;
 }

 var inputParams ="";

 inputParams = {
 IM_EMPLOYEE_ID:EMPLOYEE_ID,
 IM_LAST_NAME:LAST_NAME,
 IM_FIRST_NAME:FIRST_NAME
 };

 console.log(JSON.stringify(inputParams));

 statement.exec(inputParams,
 函数(错误,结果){
 如果(错误){
 res.type(" text/plain")。status(500).send(" ERROR:" + err.toString());
 返回;


 }其他{
 var result = JSON.stringify({
 对象:结果
 });
 res.type(" application/json")。status(200).send(result);
 }
 });
 });
 });


 

这是我们的存储过程:

/*
 获取员工详细信息以及部门,部门,职务,职位,位置和工会的描述的过程
 */
 程序" getEmployeeDetails"(在IM_EMPLOYEE_ID NVARCHAR(40)DEFAULT中,",
 在IM_LAST_NAME NVARCHAR(50)DEFAULT''中,
 在IM_FIRST_NAME NVARCHAR(50)DEFAULT''中,
 出EX_EMPLOYEES表格(
 " EMPLOYEE_ID" NVARCHAR(40),
 " LAST_NAME" NVARCHAR(50),
 " FIRST_NAME" NVARCHAR(50),
 " MIDDLE_NAME" NVARCHAR(50),
 " NICKNAME" NVARCHAR(50),
 " STATUS" NVARCHAR(40),
 " TERMINATION_DATE" NVARCHAR(30),
 " SUPERVISOR" NVARCHAR(50),
 " PHONE1" NVARCHAR(30),
 "部门" NVARCHAR(50),
 " DEPARTMENT_DESCRIPTION" NVARCHAR(30),
 " DIVISION" NVARCHAR(50),
 " DIVISION_DESCRIPTION" NVARCHAR(50),
 " JOB_TITLE" NVARCHAR(50),
 " JOB_TITLE_DESCRIPTION" NVARCHAR(50),
 " POSITION" NVARCHAR(50),
 " POSITION_DESCRIPTION" NVARCHAR(30),
 " UNUSED1" NVARCHAR(50),
 " LOCATION" NVARCHAR(50),
 " LOCATION_DESCRIPTION" NVARCHAR(50),
 " HIRE_DATE" NVARCHAR(50),
 " REHIRE_DATE" NVARCHAR(50),
 " PHONE2" NVARCHAR(30),
 " EMP_UNION" NVARCHAR(50),
 " UNION_DESCRIPTION" NVARCHAR(50),
 " SEPARATION_DATE" NVARCHAR(30),
 " UNUSED2" NVARCHAR(50),
 " PROMOTION_DATE" NVARCHAR(30),
 " ID_CARD" NVARCHAR(50))
 )
    语言SQLSCRIPT
    SQL安全调用程序
    --DEFAULT SCHEMA <默认模式名称>
    -读取SQL数据
    如
 开始


/***声明变量***/
 DECLVARE LV_SQL NVARCHAR(1000):=空;
 十进制LV_TEMP_SQL NVARCHAR(1000):= null;

 LV_SQL:='选择a.EMPLOYEE_ID,a.LAST_NAME,a.FIRST_NAME,a.MIDDLE_NAME,a.NICKNAME,a.STATUS,a.TERMINATION_DATE,a.SUPERVISOR,a.PHONE1," ||
 " a.DEPARTMENT,d.DEPARTMENT_DESCRIPTION,a.DIVISION,c.DIVISION_DESCRIPTION,a.JOB_TITLE,e.JOB_TITLE_DESCRIPTION,a.POSITION",
 'f.POSITION_DESCRIPTION,a.UNUSED1,a.LOCATION,b.LOCATION_DESCRIPTION,a.HIRE_DATE,a.REHIRE_DATE,a.PHONE2,a.EMP_UNION,'||
 'g.UNION_DESCRIPTION,a.SEPARATION_DATE,a.UNUSED2,a.PROMOTION_DATE,a.ID_CARD'||
 'FROM" SAP_AD_HDB_1"。" SAP_AD.Employees" a'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD。位置" b'||
 '开(a.LOCATION = b.LOCATION)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.Divisions" c'||
 'ON(a.DIVISION = c.DIVISION)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD。部门" d'||
 '开(a.DEPARTMENT = d.DEPARTMENT)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.JobTitles" e'||
 '开(a.JOB_TITLE = e.JOB_TITLE_ID)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.Positions" f'||
 '开(a.POSITION = f.POSITION)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.Unions" g'||
 '打开(a.EMP_UNION = g.UNION_ID)';

 LV_TEMP_SQL =:LV_SQL;

 IF(:IM_EMPLOYEE_ID <>''AND:IM_FIRST_NAME =''AND:IM_LAST_NAME ='')然后
 LV_SQL =:LV_SQL ||  '其中EMPLOYEE_ID ='''||  :IM_EMPLOYEE_ID ||  '';
 ELSEIF(:IM_FIRST_NAME <>''AND:IM_LAST_NAME =''AND:IM_EMPLOYEE_ID ='')然后
 LV_SQL =:LV_SQL ||  '其中FIRST_NAME ='''||  :IM_FIRST_NAME ||  '';
 ELSEIF(:IM_LAST_NAME <>''AND:IM_FIRST_NAME =''AND:IM_EMPLOYEE_ID ='')然后
 LV_SQL =:LV_SQL ||  '其中LAST_NAME ='''||  :IM_LAST_NAME ||  '';
 万一;


 立即执行(:LV_SQL)到EX_EMPLOYEES;

 结束
 

存储过程无法从NodeJS调用中获取参数,我们也无法调试存储过程以进行确认。

我们尝试获取CURRENT_USER并将其放入HANA用户中,但出现错误:

我们获得了当前用户-通过:

我们可以使用该用户来调试存储过程吗? 我们需要一些权限吗?

此致

周杰伦

(171.0 kB)

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

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


我们正在尝试调试从HANA上的NodeJS调用的存储过程。 我们可以调试存储过程,并且当通过UI选项尝试该过程时,该过程运行良好。 但是,当我们想通过web/nodeJS调用调试存储过程时,就会遇到问题。 我们可以毫无问题地调试NodeJS代码,但看不到传递给我们节点代码的变量:

这是我们的节点代码:

 app.get("/img/getEmployeesUsingStoredProcedure",函数(要求,要求){


 var client = req.db;
 var EMPLOYEE_ID = req.query.EMPLOYEE_ID;
 var LAST_NAME = req.query.LAST_NAME;
 var FIRST_NAME = req.query.FIRST_NAME;

 client.prepare(
 '调用" SAP_AD_HDB_1"。" getEmployeeDetails"(?,?,?,?)',
 函数(错误,声明){
 如果(err){res.type(" text/plain")。status(500).send(" ERROR:" + err.toString());
 返回;
 }

 var inputParams ="";

 inputParams = {
 IM_EMPLOYEE_ID:EMPLOYEE_ID,
 IM_LAST_NAME:LAST_NAME,
 IM_FIRST_NAME:FIRST_NAME
 };

 console.log(JSON.stringify(inputParams));

 statement.exec(inputParams,
 函数(错误,结果){
 如果(错误){
 res.type(" text/plain")。status(500).send(" ERROR:" + err.toString());
 返回;


 }其他{
 var result = JSON.stringify({
 对象:结果
 });
 res.type(" application/json")。status(200).send(result);
 }
 });
 });
 });


 

这是我们的存储过程:

/*
 获取员工详细信息以及部门,部门,职务,职位,位置和工会的描述的过程
 */
 程序" getEmployeeDetails"(在IM_EMPLOYEE_ID NVARCHAR(40)DEFAULT中,",
 在IM_LAST_NAME NVARCHAR(50)DEFAULT''中,
 在IM_FIRST_NAME NVARCHAR(50)DEFAULT''中,
 出EX_EMPLOYEES表格(
 " EMPLOYEE_ID" NVARCHAR(40),
 " LAST_NAME" NVARCHAR(50),
 " FIRST_NAME" NVARCHAR(50),
 " MIDDLE_NAME" NVARCHAR(50),
 " NICKNAME" NVARCHAR(50),
 " STATUS" NVARCHAR(40),
 " TERMINATION_DATE" NVARCHAR(30),
 " SUPERVISOR" NVARCHAR(50),
 " PHONE1" NVARCHAR(30),
 "部门" NVARCHAR(50),
 " DEPARTMENT_DESCRIPTION" NVARCHAR(30),
 " DIVISION" NVARCHAR(50),
 " DIVISION_DESCRIPTION" NVARCHAR(50),
 " JOB_TITLE" NVARCHAR(50),
 " JOB_TITLE_DESCRIPTION" NVARCHAR(50),
 " POSITION" NVARCHAR(50),
 " POSITION_DESCRIPTION" NVARCHAR(30),
 " UNUSED1" NVARCHAR(50),
 " LOCATION" NVARCHAR(50),
 " LOCATION_DESCRIPTION" NVARCHAR(50),
 " HIRE_DATE" NVARCHAR(50),
 " REHIRE_DATE" NVARCHAR(50),
 " PHONE2" NVARCHAR(30),
 " EMP_UNION" NVARCHAR(50),
 " UNION_DESCRIPTION" NVARCHAR(50),
 " SEPARATION_DATE" NVARCHAR(30),
 " UNUSED2" NVARCHAR(50),
 " PROMOTION_DATE" NVARCHAR(30),
 " ID_CARD" NVARCHAR(50))
 )
    语言SQLSCRIPT
    SQL安全调用程序
    --DEFAULT SCHEMA <默认模式名称>
    -读取SQL数据
    如
 开始


/***声明变量***/
 DECLVARE LV_SQL NVARCHAR(1000):=空;
 十进制LV_TEMP_SQL NVARCHAR(1000):= null;

 LV_SQL:='选择a.EMPLOYEE_ID,a.LAST_NAME,a.FIRST_NAME,a.MIDDLE_NAME,a.NICKNAME,a.STATUS,a.TERMINATION_DATE,a.SUPERVISOR,a.PHONE1," ||
 " a.DEPARTMENT,d.DEPARTMENT_DESCRIPTION,a.DIVISION,c.DIVISION_DESCRIPTION,a.JOB_TITLE,e.JOB_TITLE_DESCRIPTION,a.POSITION",
 'f.POSITION_DESCRIPTION,a.UNUSED1,a.LOCATION,b.LOCATION_DESCRIPTION,a.HIRE_DATE,a.REHIRE_DATE,a.PHONE2,a.EMP_UNION,'||
 'g.UNION_DESCRIPTION,a.SEPARATION_DATE,a.UNUSED2,a.PROMOTION_DATE,a.ID_CARD'||
 'FROM" SAP_AD_HDB_1"。" SAP_AD.Employees" a'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD。位置" b'||
 '开(a.LOCATION = b.LOCATION)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.Divisions" c'||
 'ON(a.DIVISION = c.DIVISION)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD。部门" d'||
 '开(a.DEPARTMENT = d.DEPARTMENT)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.JobTitles" e'||
 '开(a.JOB_TITLE = e.JOB_TITLE_ID)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.Positions" f'||
 '开(a.POSITION = f.POSITION)'||
 'INNER JOIN" SAP_AD_HDB_1"。" SAP_AD.Unions" g'||
 '打开(a.EMP_UNION = g.UNION_ID)';

 LV_TEMP_SQL =:LV_SQL;

 IF(:IM_EMPLOYEE_ID <>''AND:IM_FIRST_NAME =''AND:IM_LAST_NAME ='')然后
 LV_SQL =:LV_SQL ||  '其中EMPLOYEE_ID ='''||  :IM_EMPLOYEE_ID ||  '';
 ELSEIF(:IM_FIRST_NAME <>''AND:IM_LAST_NAME =''AND:IM_EMPLOYEE_ID ='')然后
 LV_SQL =:LV_SQL ||  '其中FIRST_NAME ='''||  :IM_FIRST_NAME ||  '';
 ELSEIF(:IM_LAST_NAME <>''AND:IM_FIRST_NAME =''AND:IM_EMPLOYEE_ID ='')然后
 LV_SQL =:LV_SQL ||  '其中LAST_NAME ='''||  :IM_LAST_NAME ||  '';
 万一;


 立即执行(:LV_SQL)到EX_EMPLOYEES;

 结束
 

存储过程无法从NodeJS调用中获取参数,我们也无法调试存储过程以进行确认。

我们尝试获取CURRENT_USER并将其放入HANA用户中,但出现错误:

我们获得了当前用户-通过:

我们可以使用该用户来调试存储过程吗? 我们需要一些权限吗?

此致

周杰伦

(171.0 kB)
付费偷看设置
发送
1条回答
何必丶何苦呢
1楼-- · 2020-09-05 13:54

我们弄清楚了为什么代码无法正常工作。 这是SAP HDB客户端无法正确将未定义的传递给SQL存储过程的问题,因此我们必须执行以下操作将输入参数初始化为",而不是作为未定义的传递:

 app.get("/img/getEmployeesUsingStoredProcedure",函数(要求,要求){


 var client = req.db;
 var EMPLOYEE_ID = req.query.EMPLOYEE_ID;
 var LAST_NAME = req.query.LAST_NAME;
 var FIRST_NAME = req.query.FIRST_NAME;


 client.prepare(
 '调用" SAP_AD_HDB_1"。" getEmployeeDetails"(?,?,?,?)',
 函数(错误,声明){
 如果(错误){
 res.type(" text/plain")。status(500).send(" ERROR:" + err.toString());
 返回;
 }

 var inputParams ="";


//这是通过将undefined替换为''来与存储过程一起使用的方法:
 inputParams = {
 IM_EMPLOYEE_ID:EMPLOYEE_ID ||  '',
 IM_LAST_NAME:LAST_NAME ||  '',
 IM_FIRST_NAME:FIRST_NAME ||  ''
 };

 console.log(JSON.stringify(inputParams));

 statement.exec(inputParams,
 函数(错误,结果){.....


 

仍然尝试从NodeJS中对存储过程进行调试-当涉及到该问题时,将撰写Blog。

-杰伊

一周热门 更多>