Oracle OCI определяет, является ли поле NCLOB или CLOB

Я ищу простой способ определить, является ли поле в Oracle NCLOB.

Когда я выполняю атрибут Get в поле, я всегда возвращаю 112 (SQLT_CLOB), независимо от того, является ли поле CLOB или NCLOB. Вот фрагмент кода того, о чем я говорю.

Связанный запрос: 'выберите ДАННЫЕ из NCLOBTest2., DATA является NCLOB в этом случае.

            ...
for I := 1 to CMaxFields do 
begin
  if oci.ParamGet( StmtHandle, OCI_HTYPE_STMT, FErrHandle, @APDesc, I ) <> OCI_SUCCESS then
    Break;
//At this Point APDesc refers to the field **DATA**.

while CheckError( oci.AttrGet( APDesc, OCI_DTYPE_PARAM, @APName, @ANameSz, OCI_ATTR_NAME, FErrHandle ) ) = OCI_STILL_EXECUTING do;

//APName and ANameSz, come back as 'DATA' and 8, respectively.  8 not 4, because it's a Unicode Environment.

while CheckError( oci.AttrGet( APDesc, OCI_DTYPE_PARAM, @ADbtype, nil, OCI_ATTR_DATA_TYPE, FErrHandle ) ) = OCI_STILL_EXECUTING do;
  DbType := ADbType;  //HERE IS THE PROBLEM, ADBTYPE IS ALWAYS SQLT_CLOB.

Нет ли такой вещи SQLT_NCLOB? Мне нужно знать, является ли поле CLOB или NCLOB, чтобы позже я мог правильно прочитать N/CLOB. Я знаю, что могу вызвать LobCharSetForm и LobCharSetID, если у меня есть фактический экземпляр LOBLocator, но для этого потребуется много дополнительных шагов.

Спасибо!

РЕДАКТИРОВАТЬ: Вот краткое изложение шагов, которые я предпринимаю, пытаясь получить LobCharSetID при определении полей. Подобный код работает просто найти при привязке параметров. Может быть, кто-то может сказать мне, какие шаги я пропускаю.

Summary of coding steps:
        CheckError( oci.HandleAlloc( EnvHandle, @FStmtHandle, OCI_HTYPE_STMT, 0, nil ) );      //sse, allocating a statement handle
        CheckError( oci.StmtPrepare( StmtHandle, FErrHandle, PChar( ServerSQL ), Length( ServerSQL )*sizeof(char), OCI_NTV_SYNTAX, OCI_DEFAULT ) );
        while CheckError( oci.AttrGet( StmtHandle, OCI_HTYPE_STMT, @FStmtType, nil, OCI_ATTR_STMT_TYPE, FErrHandle ) ) = OCI_STILL_EXECUTING do;
        //EnvHandle and StmtHandle must be allocated properly to get this far.  FStmtType comes back correctly as OCI_STMT_SELECT (1).  
        I := 32768;
        oci.AttrSet( StmtHandle, OCI_HTYPE_STMT, @I, 0, OCI_ATTR_PREFETCH_MEMORY, FErrHandle );
        ACode := oci.StmtExecute( FSvcHandle, StmtHandle, FErrHandle, Nrows, Noffs, nil, nil, OCI_DEFAULT );
        oci.ParamGet( StmtHandle, OCI_HTYPE_STMT, FErrHandle, @APDesc, I ) <> OCI_SUCCESS
        //APDesc contains an OCIParam
        CheckError (oci.DescriptorAlloc (TOracle8Connection(aSQLParam.owner.owner.Connection).EnvHandle , @LobLocator, OCI_DTYPE_LOB, 0, nil));
        ACode := oci.DefineByPos( StmtHandle, @OCIDefine( FBind ), FErrHandle, Pos, @ALobLocator, MaxInt, SQLT_CHR, nil, nil, nil, OCI_DYNAMIC_FETCH );  
        CheckError(oci.LobLocatorIsInit(Connection.EnvHandle, FErrHandle, ALOBLocator, @isLobInitialized));  //RETURNS FALSE... UH OH!
        CheckError(oci.LobCharSetId(Connection.EnvHandle, FErrHandle, ALOBLocator, @lobCHAR_CODE));   //CRASH... OCI_INVALID_HANDLE  

Последние две строки являются проблемными. Что мне нужно сделать, чтобы правильно опросить кодировку LobLocator. Обратите внимание, что кодировка LobLocator не совпадает с кодировкой определения дескриптора. Кодировка определяющего дескриптора может быть OCI_UTF16ID, в то время как кодировка Клоба может быть OCI_WE8MSWIN1252. То же самое относится к значению SQLCS, оно также не должно совпадать.

0 ответов

Другие вопросы по тегам