【发布时间】:2021-07-01 05:21:24
【问题描述】:
我在 sql-developer 中创建了下面的存储过程:
CREATE OR REPLACE PROCEDURE CREATE_USER(
t_username IN VARCHAR2,
t_password IN VARCHAR2,
t_default_table IN VARCHAR2,
t_quota IN VARCHAR2
)
IS
m_statement VARCHAR2(1300);
m_username VARCHAR2(30) := t_username;
m_password VARCHAR2(30) := t_password;
m_default_table VARCHAR2(30) := t_default_table;
m_quota VARCHAR2(30) := t_quota;
BEGIN
m_statement := 'create user ' || t_username || ' identified by ' || t_password;
IF m_default_table != 'NULL' THEN
m_statement := m_statement || ' DEFAULT TABLESPACE ' || m_default_table;
END IF;
IF m_quota != '0' AND m_default_table != 'NULL' THEN
m_statement := m_statement || ' QUOTA ' || m_quota || 'M ON ' || m_default_table;
END IF;
EXECUTE IMMEDIATE (m_statement);
END;
并且这个编译没有错误。我也连接到oracle。然后我得到了这样的用户数据(req.body):
{ username: 'a', password: 'a', tablespace: 'NULL', quota: '0' }
但是当我执行“调用”过程查询时:
oracle.getConnection(
{
uuser : "AN",
password: "AN123",
connectString: "localhost:1521/orcl"
},
(t_err, t_connection) => {
if(t_err){
console.error(t_err);
return;
}
t_connection.execute(
`BEGIN
createUser(:username, :password, :tablespace, :quota);
END;`,
{
username: req.body.username,
password: req.body.password,
tablespace: req.body.tablespace,
quota: req.body.quota,
},
(t_er, t_reslt) => {
if(t_er){
console.error(t_er);
return;
}
我收到了:
[Error: DPI-1059: bind variables are not supported in DDL statements] {
errorNum: 0,
offset: 0
}
我尝试了很多方法来修复程序或 nodejs 代码,但没有奏效。我对这个话题很陌生。谁能帮帮我?
【问题讨论】:
-
@wolφi。我已经看到了。我所有的参数都是IN参数。所以我只是为他们分配 Req.body.x 中的值。根据你给我的链接,这是真的吗?
-
有什么办法不使用dll语句?
-
我对 node-oracledb 完全不熟悉。你是对的,示例说默认是 in。但是,我很想指定数据类型和方向
username: { type: oracledb.STRING, dir: oracle_db.BIND_IN}。此外,我会简化示例,例如首先创建一个具有硬编码名称的表,不带任何参数的过程,然后为表名添加一个参数,然后慢慢地朝着您的示例前进。还请检查使用不同的变量名称,也许其中一个是保留关键字。 -
还有两种可能:1)在PL/SQL中它被称为CREATE_USER,调用代码使用createUser,但我认为这是一个错字。 2)
quota: req.body.quota,行中是否有多余的逗号?
标签: oracle ddl node-oracledb