【问题标题】:Is it possible to call a vb.net function from a stored procedure in an Oracle DB?是否可以从 Oracle DB 中的存储过程调用 vb.net 函数?
【发布时间】:2014-10-23 01:56:44
【问题描述】:

我有一个通用的字符串操作函数作为一个类开发如下;

Public Class MyClass
  Public Function MyFunction(ByVal inString As String) As String
    Dim MyString as String = inString & " Some Stuff"
    Return MyString
  End Function
End Class

真正的函数做真正的事情,但都是字符串操作,没有数据库、文件或屏幕访问。

有没有一种简单的方法可以使这个函数可以从 Oracle DB 中的包中的过程调用?

我已经在数据库服务器上安装了适用于 .NET 的 Oracle DB 扩展。

我希望避免在我开发 VB.NET 代码的计算机上安装任何东西。我之前使用 c 库(c++ DLL)创建了外部包,但我的印象是 .NET 是不同的。我在搜索时发现的所有内容似乎都在谈论某种形式的 VS 扩展,它允许直接从 .NET 进行“轻松”部署。

我最终需要将它部署在多个数据库上,并且需要一个我可以直接运行的手动过程,而不是从我的 .NET 开发计算机连接到每个数据库。

编辑:

我有一个从 PL/SQL 调用的现有 C++ 库。当我定义包体时,它看起来像;

create or replace PACKAGE BODY            "MY_PACKAGE" 
AS
   FUNCTION MY_FUNCTION (VAR1  in varchar2, VAR2 in varchar2, VAR3 in varchar2)RETURN PLS_INTEGER
   IS
      EXTERNAL 
      LIBRARY DLL_MY_LIBRARY 
      NAME "MY_FUNCTION"  
      LANGUAGE C 
      PARAMETERS (VAR1 string, VAR2 string, VAR3 string);  
END MY_PACKAGE;

类中的 VB.NET 函数的定义是什么样的?我需要点符号吗;

create or replace PACKAGE BODY            "MY_PACKAGE" 
AS
   FUNCTION MY_CLASS.MY_FUNCTION (VAR1  in varchar2, VAR2 in varchar2, VAR3 in varchar2)RETURN PLS_INTEGER
   IS
      EXTERNAL 
      LIBRARY DLL_MY_LIBRARY 
      NAME "MY_CLASS.MY_FUNCTION"  
      LANGUAGE VB.NET 
      PARAMETERS (VAR1 string, VAR2 string, VAR3 string);  
END MY_PACKAGE;

语言应该是什么?

【问题讨论】:

  • 这是您要查找的内容:Developing and Deploying .NET Stored Procedures?我想这就是你想要避免的,对吧?
  • 是的,实际上这就是我想要避免的。我想要的两条信息是,1)我是否需要对代码进行任何更改。 2)如何手动部署。
  • 看看How to run batch file from within PL/SQL procedure。如果您可以启动批处理文件,我希望您可以运行任何东西。 (哦,安全问题!哦,人性……!)分享和享受。

标签: .net vb.net oracle plsql


【解决方案1】:

我从未尝试过,但乍一看,我会尝试以下方法:

来自 Oracle Extension for .NET 开发人员指南 11g 第 2 版

Development and Deployment with Visual Studio

Step 5: Deploy the Procedure or Function

在数据库中部署过程或函数。该向导执行以下步骤:

  1. 以 SYSDBA 身份连接。
  2. 将用户程序集复制到 ORACLE_BASE\ORACLE_HOME\bin\CLR 目录或其子目录。
  3. 创建一个 Oracle 库对象并将此库对象的执行权限授予数据库用户:
CREATE OR REPLACE LIBRARY CLRLIBRARY1_DLL AS '$ORACLE_HOME\bin\clr\CLRLibrary1_dll;
GRANT EXECUTE ON CLRLIBRARY1_DLL TO SCOTT;
  1. 根据用户定义的参数类型映射,在用户的数据库架构中为每个过程或函数创建一个 PL/SQL 包装器。

确切地知道向导做了什么,在我看来,编写一个 Power Shell 脚本或类似的东西来为你执行任务是可行的。

我会继续挖掘。这是我感兴趣的一个有趣的功能。


当我创建 pl/sql 包装器时,我会使用点符号吗?

Step 6 : Test the function 应该会回答您的问题。

Invoking from SQL*Plus

要从 SQL 调用 GetDeptNo() 函数 .NET 函数 Plus:

启动 SQLPlus 并以用户 scott 的身份使用密码 Tiger 登录。*

输入以下命令:

SET SERVEROUTPUT ON;
DECLARE
deptno BINARY_INTEGER;
BEGIN
  deptno := GetDeptNo(7934);
  DBMS_OUTPUT.PUT_LINE(deptno);
END;

或者,您可以执行以下语句:

SELECT GetDeptNo(7934) FROM DUAL;

所以在我看来,您不需要使用点符号。

【讨论】:

  • 威尔,我会试一试。我有一个问题是因为我的函数被包装在一个类中,当我创建 pl/sql 包装器时,我会使用点符号吗?我编辑我的问题以提供更详细的信息。
  • 我谦虚的回答对一些人有帮助吗?也许还有其他遗漏的细节? =)
  • 我尝试了您的方法,但出现错误。用 Oracle 记录了一个 SR,分配给我的案例的个人在过去三周里一直没有帮助。我已经将它升级了两次,并试图找到一个不同的人,但没有运气。
  • 你遇到了什么错误?也许发布另一个问题或编辑您当前的问题可以启发一个潜在的解决方案。
猜你喜欢
  • 2019-07-16
  • 1970-01-01
  • 2020-05-20
  • 2011-04-09
  • 1970-01-01
  • 2021-12-22
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多