2

如何BOOLEAN在 12c 中传递给 Oracle 程序?

听说在12c之前是不可能的,但是我在12c还是做不到。

// https://docs.oracle.com/cd/A91202_01/901_doc/appdev.901/a89852/d_metad8.htm
// PROCEDURE set_transform_param (
//     transform_handle        IN  NUMBER,
//     name                    IN  VARCHAR2,
//     value                   IN  BOOLEAN DEFAULT TRUE,
//     object_type             IN  VARCHAR2 DEFAULT NULL);
var cmd = new OracleCommand();
cmd.Connection = new OracleConnection(this.scon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "DBMS_METADATA.SET_TRANSFORM_PARAM";
cmd.BindByName = true;
cmd.Parameters.Add("transform_handle", OracleDbType.Int64).Value = -1;
cmd.Parameters.Add("name", OracleDbType.Varchar2).Value = "STORAGE";
cmd.Parameters.Add("value", "N");
cmd.Connection.Open();
cmd.ExecuteNonQuery();

我尝试了以下方法,但出现错误。

"0", "F", "N", '0', 'F', 'N'

错误:

ORA-31600: invalid input value "0" for parameter STORAGE in function SET_TRANSFORM_PARAM
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8680
ORA-06512: at "SYS.DBMS_METADATA_INT", line 10027
ORA-06512: at "SYS.DBMS_METADATA", line 7458
ORA-06512: at line 1
4

1 回答 1

1

我有同样的问题。

我用一种解决方法解决了这个问题。

1)创建一个包装的存储过程,然后你可以使用布尔或其他参数,如pl-sql;

2)在同一个会话(同一个OracleConnection)中调用包装的存储过程;

3) 在同一会话中调用 SELECT DBMS_METADATA.GET_DDL;

...
OracleCommand command = null;
string storedprc = "CREATE OR REPLACE PROCEDURE MY_SCHEMA.SET_FK_FALSE AS BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',false); END;";
command = new OracleCommand(storedprc, this.Conn);
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
//       
command = new OracleCommand();
command.Connection = this.Conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "MY_SCHEMA.SET_FK_FALSE";
command.ExecuteNonQuery();
//
string queryString = "SELECT DBMS_METADATA.GET_DDL( 'TABLE','MY_TABLE_NAME','MY_SCHEMA') FROM DUAL;";
command = new OracleCommand(queryString, this.Conn);
command.CommandType = CommandType.Text;
reader = command.ExecuteReader();
string ddlScript = null;
if (reader.Read())
{
    ddlScript = reader[0].ToString();
}
reader.Close();
...

希望它可以帮助某人,因为我从互联网上获得了所有提示。

于 2017-07-17T09:55:38.357 回答