2013-12-25 3 views
1

Мне нужно создать хранимую процедуру в оракуле из delphi с помощью TQuery. Но SQL.text трудно понять. Есть ли способ сохранить прямой текст в виде pl/SQL без кавычек?Сохраненная процедура Сохранение текста в Delphi

'create or replace '+ 
'function WholeTableRecovery(i_tablname IN varchar) return varchar '+ 
'as '+ 

Возможен ли с помощью файла ресурсов

Заранее спасибо

+0

Например, вы можете разместить его как содержимое «TMemo» в своей форме, затем скрыть его во время выполнения и просто прочитать текст из него. Существуют также сторонние невизуальные компоненты, содержащие тексты в DFM. PS: с файлом ресурсов вам нужно будет правильно сохранить текст как UTF-16 или не-Unicode для разных версий Delphi. Это возможно, но это неприятность. Какова ваша настоящая версия Delphi и что вы пытаетесь выполнить, и что именно проблема? PS: BDE действительно, действительно устарел сегодня. Подумайте о переключении в какую-то прямую библиотеку! –

+0

Что именно вы не можете понять с помощью TQuery.SQL.Text? Он будет сохранен для вас уже. Каков ваш реальный вопрос? –

+0

Конечно, есть способ. Свойство 'SQL' является обычным потоком' TStrings', поэтому сохраняйте ваши SQL-запросы в виде текстового ресурса и используйте метод 'TQuery.SQL.LoadFromStream' для' TResourceStream', где вы загрузите ресурс с запросом. – TLama

ответ

4

Поскольку вы используете Delphi 2010 в тегах (я не имею Delphi-здесь, чтобы проверить), удобный метод будет хранящим SQL в отдельных текстовых файлах вместе с RC-файлом, содержащим директивы для компилятора ресурсов.
enter image description here

Файлы RC будет содержать имена ресурса вы хотите использовать вместе с именами файлов, содержащими SQLs вы хотите сохранить. Содержание для примера будет выглядеть следующим образом:

My_First_Speaking_ResourceName RCDATA "MyFirstSQL.sql" 
My_Second_Speaking_ResourceName RCDATA "MySecondSQL.sql" 

Там нет необходимости вызывать BRCC32 непосредственно, если включить ресурс, содержащий RC и результирующий RES:

{$R 'MySQLResources.res' 'resources\MySQLResources.rc'} 

Вы можете обернуть использование TResourceStream для вашего удобства, как показано в примере будет использовать строки, которые вы могли бы также работать с потоком непосредственно, как упомянуто TLama MyQuery.SQL.LoadFromStream(rs);

implementation 

{$R *.dfm} 

{$R 'MySQLResources.res' 'resources\MySQLResources.rc'} 

function LoadSqlResource(resourceName: string): string; 
var 
    rs: TResourceStream; 
    sl: TStringList; 
    s : string; 
begin 
    sl := TStringList.Create; 
    try 
    rs := TResourceStream.Create(hinstance, resourceName, RT_RCDATA); 
    try 
    rs.Position := 0; 
    sl.LoadFromStream(rs); 
    Result := sl.Text; 
    finally 
    rs.Free; 
    end; 
    finally 
    sl.Free; 
    end; 
end; 

procedure CallOneSql(Q:TADOQuery;ResourceName:String); 
begin 
    Q.SQL.Text := LoadSqlResource('My_First_Speaking_ResourceName'); 
    Q.ExecSQL; 
end; 

По телефону CallOneSql(MyQuery,'My_First_Speaking_ResourceName');

Обязательно создайте проект, а не просто скомпилируйте, если вы внесли изменения в RC или файлы SQL.

+0

* Нет необходимости звонить BRCC32 *. У Delphi 2010 IDE есть опция меню для включения файлов в такие ресурсы, как проект/ресурсы и изображения XE2? PS. Хотя спасибо за двоичный синтаксис $ R, не слышал об этом, лучше для контроля версий –

+0

@ Arioch'The да D2010 уже поддерживает '{$ R * .dres}'. Хороший момент, вы можете добавить его как собственный ответ. Я просто привык к предлагаемому пути, поскольку уже некоторые из моих шаблонов и стандартных единиц используют ресурсы, не зависящие от проектов. – bummi

+0

, пытаясь перенести pre-Unicode DUnit на XE2 и получить много неприятностей ansi/wide в текстах RC, я очень осторожно отношусь к текстам непосредственно в RC. Вы можете просто разместить их на формах или модулях данных. Особенно, если оба D2010 и D7 должны сосуществовать –