Oracle、动态 SQL 和命名参数

发布于 2024-11-02 11:54:20 字数 645 浏览 0 评论 0原文

(我发现这部分回答了问题,虽然考虑到我的sql将在oracle和mssql中使用,但声明方式看起来会更整洁:) 在动态PL/SQL中绑定变量

我有一些动态sql使用如下语法执行:

EXECUTE IMMEDIATE plsql_block USING employeeid, sortname;

然后我可以使用 :1、:2 等访问动态 sql 中的这些变量。 我可以使用命名参数吗?类似的东西

EXECUTE IMMEDIATE plsql_block USING employeeid => employeeid 

,然后使用 :employeeid 在动态 sql 中访问它们,而不是依赖于职位?

如果不是,我的想法是在sql的开头做这样的事情:

declare employeeid varchar(15 := :1; 

然后我可以将我的动态sql更改为我想要的内容,而不必担心定位。

有更好的办法吗?

谢谢

(I've found this which partly answers the question, the declare way would look neater though given that my sql is will be used in oracle and mssql:)
Binding variables in dynamic PL/SQL

I have some dynamic sql which I'm executing using syntax like the below:

EXECUTE IMMEDIATE plsql_block USING employeeid, sortname;

and I can then access those variables inside the dynamic sql using :1, :2, etc.
Can I use named parameters instead? something like

EXECUTE IMMEDIATE plsql_block USING employeeid => employeeid 

and then access them inside the dynamic sql using :employeeid rather than relying on position?

If not my thought is to do something like this at the beginning of the sql:

declare employeeid varchar(15 := :1; 

and then I can change my dynamic sql to my hearts content without worrying about positioning.

Is there a better way?

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

水波映月 2024-11-09 11:54:20

您的解决方法是我过去使用过的。
还有很好的旧 DBMS_Sql,它允许像通过 OCI 那样绑定变量。 (这基本上就是 DBMS_Sql 似乎正在做的事情;-))

Your workaround is what I have used in the past.
There's also good old DBMS_Sql, which allows binding variables like you would be able to via OCI. (Which is basically what DBMS_Sql seems to be doing anyways ;-) )

清风夜微凉 2024-11-09 11:54:20

您可以在 DBMS_SQL 中使用命名参数:

DECLARE
        res INT;
        cr INT;
BEGIN
        cr := DBMS_SQL.OPEN_CURSOR;
        DBMS_SQL.PARSE(cr, :plsql_block, DBMS_SQL.NATIVE);
        DBMS_SQL.BIND_VARIABLE(cr, ':employee', :employee);
        res := DBMS_SQL.EXECUTE(cr);
        DBMS_SQL.CLOSE_CURSOR(cr);
END;

You can use named arguments in DBMS_SQL:

DECLARE
        res INT;
        cr INT;
BEGIN
        cr := DBMS_SQL.OPEN_CURSOR;
        DBMS_SQL.PARSE(cr, :plsql_block, DBMS_SQL.NATIVE);
        DBMS_SQL.BIND_VARIABLE(cr, ':employee', :employee);
        res := DBMS_SQL.EXECUTE(cr);
        DBMS_SQL.CLOSE_CURSOR(cr);
END;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文