Mokky Miah
Mokky Miah

Reputation: 1353

How to return value from stored procedure using PDO on MSSQL database

I have a stored procedure that when called updates few tables and eventually returns an integer value.

When I call this stored procedure using SQL Pro tool, I get back a result as expected. The SQL that is auto-generated by the tool is this;

DECLARE @return_value int

EXEC @return_value =
    dbo.GetNextReference
        @c_tableName = 'prp',
        @c_offYear = 'rcs14'

SELECT
    'Return Value' = @return_value

However, I can't seem to get the same results or any results when I try to execute this using PHP PDO driver.

This is my code so far;

  $conn = $this->getPDO();
  $sql = "CALL GetNextReference (? , ?)";
  $stmt = $conn->prepare($sql);
  $tbl = 'prp';
  $year = "rcs14";
  $stmt->execute([$tbl, $year]);
  $results = $stmt->fetchAll();

The statement executes without any errors but the results come back as an empty array.

What am I missing?

Sorry, I can't post the actual stored procedure as I am not permitted.

Upvotes: 1

Views: 1640

Answers (2)

Zhorov
Zhorov

Reputation: 30023

If I understand your question correctly and if you want to check the result of stored procedure execution, you may try with this:

<?php
# Connection
$server = 'server\instance,port';
$database = 'database';
$uid = 'user';
$pwd = 'password';

# Statement
try {
    $conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server" );
}

try {
    $sql  = "{? = call GetNextReference (? , ?)}";
    # This should work also.
    #$sql = "exec ? = GetNextReference (? , ?)";
    $spresult = 0;
    $tbl  = 'prp';
    $year = "rcs14";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(1, $spresult, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
    $stmt->bindParam(2, $tbl);
    $stmt->bindParam(3, $year);
    $stmt->execute();
    # Next line for single resultset 
    #$results = $stmt->fetchAll();
    # Multiple resultsets
    do {
        $results = $stmt->fetchAll();
        print_r($results, true);
    } while ($stmt->nextRowset());  
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server" );
}

$stmt = null;
$conn = null;

echo 'Stored procedure return value : '.$spresult."</br>";
?>

Upvotes: 1

Thom A
Thom A

Reputation: 96055

Op has asked for an example of an OUTPUT parameter. it doesn't specifically answer their question, however, is far too long for a comment:

USE Sandbox;
GO
--Sample Table
CREATE TABLE dbo.TestTable (ID int IDENTITY(1,1),
                            SomeString varchar(20));

GO
--Sample proc
CREATE PROC dbo.TestSP @SomeString varchar(20), @ID int OUTPUT AS

    --You cannot OUTPUT from an INSERT into a scalar variable, so we need a table variable
    DECLARE @IDt table(ID int);

    INSERT INTO dbo.TestTable (SomeString)
    OUTPUT inserted.ID
    INTO @IDt
    SELECT @SomeString;

    --Now set the scalar OUTPUT parameter to the value in the table variable    
    SET @ID = (SELECT ID FROM @IDt); --this works, as the SP is designed for only one row insertion

GO

DECLARE @SomeString varchar(20) = 'abc', @ID int;

EXEC dbo.TestSP @SomeString = @SomeString,
                @ID = @ID OUTPUT; --ID now has the value of the IDENTITY column

--We can check here:
SELECT @ID AS OutputID;
SELECT *
FROM dbo.TestTable;
GO
--Clean up
DROP PROC dbo.TestSP;
DROP TABLE  dbo.TestTable;
GO

Upvotes: 0

Related Questions