【问题标题】:Stored procedure output variable being stored as input/output type存储过程输出变量被存储为输入/输出类型
【发布时间】:2020-09-19 02:14:41
【问题描述】:

我正在尝试使用 Java SQL API 在 Microsoft SQL Server 中获取存储过程的元数据。

这是存储过程的结构:

CREATE PROCEDURE [dbo].[testproc] 
    (@rolloverType AS integer,
     @retval nvarchar(50) output)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT @retval = [col1]
    FROM [dbo].[Table_1]
    WHERE col3 = @rolloverType;
END
GO

但是,Java SQL API 说@retvalINOUT 类型,Microsoft SQL Server Management Studio 也将此参数显示为Input/Output 类型。如何构造此存储过程,使@retval 仅属于Output 类型?

【问题讨论】:

  • SQL Server 中没有仅输出参数。

标签: sql sql-server stored-procedures


【解决方案1】:

正如@GSerg 所说,你不能。

在 SQL 中,OUTPUT 参数同时充当INPUTOUTPUT,请参阅this answer

由于用于引用 ORACLE 过程参数类型(INOUTINOUT)的映射,您将获得一个 INOUT 值。

来自dba-oracle.com

作为模式IN 传递的变量始终是只读的。一个变量 使用IN 模式可以被过程/函数读取和使用,但可以 不能被改变,它不能是任务的接收者 操作。

OUT 模式传递的变量用于将信息从 调用程序的过程。它是一个只写变量,并且 在块为其赋值之前没有任何值。

INOUT 模式传递的变量具有INOUT 模式。变量值被传入并且可以被 程序。该过程还可以更改该值,它将是 过程完成时复制回传递的变量。

【讨论】:

    【解决方案2】:

    如果 Management Studio 将 @retval 视为 OUTPUT,您将能够从外部读取此值。 @retval 也被标记为 Input 的事实是无关紧要的。

    【讨论】:

    • 当您有 Java 代码检查其类型是否为 INOUT 或只是 OUT 时,这并非无关紧要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多