Hugeclob oracle что это

Обновлено: 05.07.2024

Здесь я хочу привести свой код, для работы с БД Oracle (Не вставил в предыдущий топик т.к. полилось много текста и НЛО послало процесс сохранения лесом).

Вообще CLOB(LOB\BLOB) довольно интересен. Работа с ним отличается от работы с другими объектами. Детальное описание вы так же можете посмотреть в MSDN.
Скажу лишь то что сделать что-то вроде:

OracleParameter someClob = new OracleParameter()
ParameterName = "some_clob" ,
Direction = ParameterDirection.Input,
OracleType = OracleType.Clob,
Value = clobData
>;

не выйдет, подход должен быть тоньше.

На сладкое

У программистов и дизайнеров, да и наверное у всех людей, есть общая черта, я называю её «кнопка MakeItPizdato». Т.е. получить при наименьших затратах, чего угодно, максимальную эффектиность\продуктивность\подставить по своему желанию.
Поэтому я написал свой код (критике буду только рад! но разумной критике ;) ), которым решил поделиться:

Работа с БД разбита на несколько частей:
Фабрика — отвечает за полную работу с БД

using System;
using System.Collections. Generic ;
using System.Data;
using System.Data.OracleClient;
using System.Linq;
using Core.Extensions;

public OracleFactory()
InitializeConnection();
>

public OracleFactory( String connectionString)
_connectionString = connectionString;
InitializeConnection();
>

private void InitializeConnection()
Commands = new Dictionary< String , OracleCommand>();
RollbackCommandNames = new List < string >();

try
_connection = new OracleConnection(_connectionString);
_connection.Open();
>
catch (OracleException oraEx)
Console .WriteLine( "Connection failed with message: " + oraEx.ToString());
>
>

OracleFactory()
Dispose( false );
>

public void Dispose()
Dispose( true );
GC.SuppressFinalize( this );
>

if (disposeManagedResources)
foreach ( String commandName in Commands.Keys)
Commands[commandName].Dispose();
>
//Dispose connection information
_connection.Close();
_connection.Dispose();
>

public OracleConnection Connection
get
return (_connection);
>
>

public Dictionary< String , OracleCommand> Commands
get ;
private set ;
>

public List < String > RollbackCommandNames
get ;
private set ;
>

/// <summary>
/// Last used command name
/// </summary>
/// <exception cref="System.ArgumentException"/>
public String LastCommandName
get
if (_lastCommandName == String .Empty)
throw new ArgumentException( "LastCommandName is not specified" );

return (_lastCommandName);
>
set
_lastCommandName = value ;
>
>

/// <summary>
/// Last used command
/// </summary>
public OracleCommand LastCommand
get
return (Commands[LastCommandName]);
>
>

public Object this [ String commandName, String parameterName]
get
if (!Commands.Keys.Contains(commandName))
throw new OracleFactoryException();

return (Commands[commandName].Parameters[parameterName].Value);
>
set
Commands[commandName].Parameters[parameterName].Value = value ;
>
>

public Object this [ String parameterName]
get
return ( this [LastCommandName, parameterName]);
>
set
this [LastCommandName, parameterName] = value ;
>
>

/// <summary>
/// Creates a new Oracle`s command (default for stored procedures)
/// </summary>
/// <exception cref="Core.DL.OracleManagerException">
/// </exception>
/// <param name="commandName">Oracle`s command name</param>
public void CreateCommand( String commandName)
CreateCommand(commandName, CommandType.StoredProcedure);
>

/// <summary>
/// Creates a custom Oracle`s command
/// </summary>
/// <exception cref="Core.DL.OracleManagerException">
/// </exception>
/// <param name="commandName">Oracle command name</param>
/// <param name="commandType">Oracle command type</param>
public void CreateCommand( String commandName, CommandType commandType)
if (Commands.Keys.Contains(commandName))
throw new OracleFactoryException();

public void ClearParameters()
LastCommand.Parameters.Clear();
>

public void AddParameter( String parameterName, OracleType parameterType, Object parameterValue)
AddParameter(LastCommandName, parameterName, parameterType, parameterValue, ParameterDirection.Input);
>

public void AddParameter( String parameterName, OracleType parameterType, Object parameterValue, ParameterDirection parameterDirection)
AddParameter(LastCommandName, parameterName, parameterType, parameterValue, parameterDirection);
>

public void AddParameter( String commandName, String parameterName, OracleType parameterType,
Object parameterValue, ParameterDirection parameterDirection)
if (!Commands.Keys.Contains(commandName))
throw new OracleFactoryException();

if (parameterType == OracleType.Clob)
parameterValue = OracleFactory.PrepareCLOB(Commands[commandName], parameterValue.ToString());

Commands[commandName].Parameters.Add( new OracleParameter(parameterName, parameterType)
Direction = parameterDirection,
Value = parameterValue ?? DBNull.Value
>);
>

public void ExecuteNonQuery()
ExecuteNonQuery(LastCommandName);
>

public OracleDataReader ExecuteReader()
return (ExecuteReader(LastCommandName));
>

public OracleDataReader ExecuteReader( String commandName)
OracleDataReader dataReader = Commands[commandName].ExecuteReader();

public void Rollback( String commandName)
if (!RollbackCommandNames.Contains(commandName))
RollbackCommandNames.Add(commandName);
>
>

public void Rollback()
Rollback(LastCommandName);
>

public static OracleLob PrepareCLOB(OracleCommand command, String data)
OracleLob clob = CreateLob(command, OracleType.Clob);
byte [] byteData = System.Text. Encoding .Unicode.GetBytes(data);

clob.BeginBatch(OracleLobOpenMode.ReadWrite);
clob.Write(byteData, 0, byteData.Length);
clob.EndBatch();

public static OracleLob CreateLob(OracleCommand command, OracleType lobType)
if (command.Transaction == null )
throw new OracleFactoryException( "Parameter command should contains transaction value" );

if (lobType != OracleType.Clob && lobType != OracleType.Blob)
throw new OracleFactoryException( "Thhis method is used only for creation LOB objects" );

//Prepare for creating LOB object
command.Parameters.Clear();

command.CommandType = CommandType.Text;
command.CommandText = String .Format( "declare xx ; begin dbms_lob.createtemporary(xx, false, 0); :tempLob := xx; end;" ,
lobType == OracleType.Clob ? "clob" : "blob" );
command.Parameters.Add( new OracleParameter( "tempLob" , lobType) < Direction = ParameterDirection.Output >);
command.ExecuteNonQuery();

OracleLob retLob = command.Parameters[ "tempLob" ].Value as OracleLob;

Я подсел на использование расширяющих методов (Extensions). А в рамках того что мне нужно было подготовить коллекцию параметров для использования с типами LOB (сохранить, а затем восстановить), я придумал такое расширение:

namespace Core.Extensions
public static class OracleParameterCollectionExtensions
public static void MakeClone( this OracleParameterCollection sourceCollection, OracleParameterCollection outCollection)
foreach (OracleParameter parameter in sourceCollection)
OracleParameter newParam = new OracleParameter()
Direction = parameter.Direction,
IsNullable = parameter.IsNullable,
OracleType = parameter.OracleType,
ParameterName = parameter.ParameterName,
Value = parameter.Value
>;

* This source code was highlighted with Source Code Highlighter .

Начав использовать данный код сегодня, вы бесплатно получаете + Exception!:

namespace TestApp.Core
public class OracleFactoryException : Exception
public OracleFactoryException()
>

public OracleFactoryException( String exMessage)
: base (exMessage)

Для меня телодвижений стало меньше, теперь добавление выглядит так:

public void AddConscript( string firstName, string lastName, int ages, float growth, string biograpby)
using (OracleFactory factory = new OracleFactory())
factory.CreateCommand( "ADD_CONscript" );

factory.AddParameter( "FirstNameIn" , OracleType.VarChar, firstName);
factory.AddParameter( "LastNameIn" , OracleType.VarChar, lastName);
factory.AddParameter( "AgesIn" , OracleType.Number, ages);
factory.AddParameter( "GrowthIn" , OracleType.Float, growth);
factory.AddParameter( "BiographyIn" , OracleType.Clob, biograpby);
>
>

Код упрощён, можно использовать тот же CLOB прозрачно относительно других типов.
Если вам необходимо получить значение определённого параметра следующим образом:

Те кто поковыряются в коде, найдут ещё много чего интересного ;).

Вы спросите почему именно CLOB? Я отвечу — мне другие LOB пока были не нужны, а код я точил под себя ;).


PL/SQL: BLOB, CLOB, NCLOB и BFILE

Oracle и PL/SQL поддерживают несколько разновидностей типов данных, предназначенных специально для работы с большими объектами ( LOB, Large OBjects ). Такие объекты позволяют хранить огромные (от 8 до 128 терабайт) объемы двоичных (например, графических) или текстовых данных.

До выхода Oracle9i Release2 в объектах LOB можно было хранить до 4 Гбайт данных. Начиная с Oracle10g, ограничение было повышено до величины от 8 до 128 терабайт (конкретное значение зависит от размера блока вашей базы данных).

В PL/SQL можно объявлять большие объекты четырех типов:

  • BFILE — двоичный файл. Переменная этого типа содержит локатор файла, указывающий на файл операционной системы вне базы данных. Oracle интерпретирует содержимое файла как двоичные данные.
  • BLOB — большой двоичный объект. Переменная этого типа содержит локатор LOB , указывающий на большой двоичный объект, хранящийся в базе данных.
  • CLOB — большой символьный объект. Переменная этого типа содержит локатор LOB , указывающий на хранящийся в базе данных большой блок текстовых данных в наборе символов базы данных.
  • NCLOB — большой символьный объект с поддержкой символов национальных языков ( NLS ). Переменная этого типа содержит локатор LOB , указывающий на хранящийся в базе данных большой блок текстовых данных с национальным набором символов.

Большие объекты можно разделить на две категории: внутренние и внешние. Внутренние большие объекты (типы BLOB, CLOB и NCLOB ) хранятся в базе данных и могут участвовать в транзакциях на сервере базы данных. Внешние большие объекты (тип BFILE ) представляют двоичные данные, хранящиеся в файлах операционной системы вне таблиц базы данных. Они не могут участвовать в транзакциях, то есть вносимые в них изменения нельзя сохранить или отменить в зависимости от результата транзакции. Целостность данных обеспечивается только на уровне файловой системы. Кроме того, повторное чтение из BFILE может приводить к разным результатам — в отличие от внутренних больших объектов, соответствующих модели логической целостности чтения.

LONG И LONG RAW

Вероятно, спецы, знакомые с Oracle, заметили, что мы до сих пор не упоминали о типах данных LONG и LONG RAW . И это не случайно. Конечно, в столбцах типа LONG и LONG RAW базы данных можно хранить большие объемы (до 2 Гбайт) соответственно символьных и двоичных данных. Однако максимальная длина соответствующих им переменных PL/SQL значительно меньше: всего лишь 32 760 байт, что даже меньше длины переменных VARCHAR2 и RAW (32 767 байт). С учетом столь странного ограничения в программах PL/SQL лучше использовать переменные типа VARCHAR2 и RAW , а не типа LONG и LONG RAW.

Значения типов LONG и LONG RAW , извлекаемые из базы данных и содержащие более 32 767 байт данных, не могут присваиваться переменным типа VARCHAR2 и RAW . Это крайне неудобное ограничение, из-за которого типы LONG и LONG RAW лучше вообще не применять.

Эти типы официально считаются устаревшими и поддерживаются только для сохранения обратной совместимости кода. Компания Oracle не рекомендует ими пользоваться, и я с ней полностью согласен. В новых приложениях вместо них лучше использовать типы CLOB и BLOB . А для существующих приложений в документации Oracle SecureFiles and Large Objects Developer’s Guide приводятся рекомендации по преобразованию данных типа LONG в данные типа LOB .

Я пытаюсь выполнить запрос, в котором несколько столбцов имеют тип данных CLOB. Если я запустил запрос как обычно, все эти поля будут иметь только (CLOB) в качестве значения.

Как я могу запросить столбец CLOB?

При получении подстроки столбца CLOB и использовании инструмента запроса, который имеет ограничения по размеру / буферу, иногда вам нужно установить BUFFER на больший размер. Например, при использовании SQL Plus используйте SET BUFFER 10000 , чтобы установить значение 10000, поскольку значение по умолчанию - 4000.

Запустив команду DBMS_LOB.substr , вы также можете указать количество символов, которые вы хотите вернуть, и смещение, от которого. Таким образом, использование DBMS_LOB.substr(column, 3000) может ограничить его до достаточно небольшого количества для буфера.

См. документацию Oracle для получения дополнительной информации о команде substr

Я столкнулся с другим условием с HugeClob в моей базе данных Oracle. dbms_lob.substr допускает только значение 4000 в функции, например:

Поэтому для моего HughClob, который был больше, мне пришлось использовать два вызова в select :

Я звонил из приложения Java, поэтому я просто объединил часть 1 и часть 2 и отправил по электронной почте.

Если это CLOB, почему мы не можем to_char столбца, а затем выполнить поиск в обычном режиме?

Создайте несколько записей в этой таблице

Искать в столбце Clob

Для больших выборок CLOB также можно использовать:

SELECT dbms_lob.substr( column_name, dbms_lob.getlength(column_name), 1) FROM foo

Другой вариант - создать функцию и вызывать эту функцию каждый раз, когда вам нужно выбрать столбец clob.

И вызовите эту функцию как;

Чтобы добавить к ответу.

first parameter - это clob , который вы хотите извлечь.

Second parameter - это длина сгустка, который вы хотите извлечь.

Third parameter - это слово, из которого вы хотите извлечь.

В приведенном выше примере я знаю, что размер моего сгустка больше 50000, поэтому мне нужны последние 4000 символов.

Я видел много таблиц в toad, где данные столбца поступают как 'HUGECLOB'. Может ли кто-нибудь объяснить мне, как увидеть такой тип столбцов и до этого, что такое тип данных этих столбцов и как мы храним текстовый файл xml или sql внутри этого файла

1 ответ

Я учусь Oracle. CURSOR A FOR TABLE1 LOOP DELETE B TABLE RECORD BASED ON CURSOR A END LOOP Я читаю курсор из таблицы а и, основываясь на результате, удаляю еще 2 записи таблицы. Пожалуйста, дайте мне знать, что в этом случае мне нужно обеспечить обновление при объявлении Oracle или оно не.

У меня есть 3 таблицы в моем Oracle DB, а именно AMI2.AMI2_RESOURCE_ITEM_JN ID NUMBER(18,0) NULL, TYPE_CODE VARCHAR2(20 BYTE) NULL, USER_JN VARCHAR2(32 BYTE) NOT NULL, AMI2_RESOURCE_ITEM_DOTNET_JN ID NUMBER(18,0) NULL, NAAM VARCHAR2(500 BYTE) NULL, USER_JN VARCHAR2(32 BYTE) NOT NULL.

В TOAD значение возвращаемого поля (HUGHCLOB) можно просмотреть, дважды щелкнув значение (HUGECLOB) в строке. Это откроет всплывающий редактор сетки с полным значением поля.

Если вы хотите просмотреть данные через sql попробуйте:

Это позволит вам просматривать начальные символы до указанной вами длины.

Похожие вопросы:

Может ли кто-нибудь дать мне некоторые подробности о правильном использовании тега <mx:SetEventHandler /> , используемого при переключении состояний? Документация Flex не очень подробно.

Я использую TOAD (11.0 R2) для Oracle. Мне нужно обновить один из столбцов в таблице, содержащей данные типа NCLOB. Мое заявление UPDATE выглядит следующим образом: UPDATE table1 SET string_content.

Я учусь Oracle. CURSOR A FOR TABLE1 LOOP DELETE B TABLE RECORD BASED ON CURSOR A END LOOP Я читаю курсор из таблицы а и, основываясь на результате, удаляю еще 2 записи таблицы. Пожалуйста, дайте мне.

У меня есть 3 таблицы в моем Oracle DB, а именно AMI2.AMI2_RESOURCE_ITEM_JN ID NUMBER(18,0) NULL, TYPE_CODE VARCHAR2(20 BYTE) NULL, USER_JN VARCHAR2(32 BYTE) NOT NULL, AMI2_RESOURCE_ITEM_DOTNET_JN.

Я создал следующую программу и последующие Oracle JOB: BEGIN DBMS_SCHEDULER.create_program (program_name => 'myProg', program_action => 'myProc', program_type => 'STORED_PROCEDURE'.

Я использовал Sqoop для приема данных с Oracle по Hadoop, и это хорошо работало. Потребовалось всего 4 минуты, чтобы перенести 86 миллионов записей из таблицы Oracle в таблицу Hive без использования.

Я использую Unix AIX. Есть ли способ узнать подробности о разрешениях, к которым имеет доступ дополнительная группа ID? (т. е. разрешения только на чтение для данного каталога) Я понимаю, что члены.

Я сталкиваюсь с приведенной ниже ошибкой/предупреждением, когда я вхожу в oracle 12 с помощью клиента sqlplus. Подробности : SQL*Plus: выпуск 12.1.0.2.0 производство в пятницу 8 ноября 05:38:11 2019.

Читайте также: