Спасибо за ответ, ребята.Я вроде как решил свою проблему.
Я пытался обновить данные с помощью курсора ref в динамическом SQL, используя "where current of", но теперь я знаю, что это не сработает.
Тогда япопытался использовать% rowtype для хранения обоих 'id' и 'clob' в одной переменной для будущего обновления, но оказалось, что слабый курсор ref также не может использовать привязку этого типа.
После этого я попытался использовать запись каквозврат реф курсора, и это тоже не работает на слабом курсоре.
В конце я создал еще один курсор для извлечения 'id' отдельно вместе с курсором для получения 'clob' в то же время, а затем обновилтаблица с этим идентификатором.
Сейчас я работаю над задачей очистки данных Oracle, и у меня есть следующее требование:
Есть 38 таблиц (может быть, больше в будущем), и каждая таблица имеет одну илинесколько столбцов, тип которых Clob.Мне нужно найти другое ключевое слово в этих столбцах и в соответствии с логикой вернуть двоичную метку столбца и сохранить его в новом столбце.
Например, есть таблица 'myTable1', которая имеет 2 столбца Clob 'clob1 'и' clob2 '.Я хотел бы найти ключевое слово 'sky' из этих столбцов и сохранить '0' (если не найден) или '1' (если найден) в двух новых столбцах: 'clob1Sky', 'clob2Sky'.
IЯ знаю, могу ли я написать это статическим способом, который обеспечит более высокую эффективность, но я должен каждый раз модифицировать его для тех же самых похожих задач.Я хочу сэкономить некоторое время на этом, поэтому я пытаюсь записать его повторно и не привязывать к определенной таблице.
Но я столкнулся с некоторой проблемой при написании программы.Моя программа похожа на приведенную ниже:
create or replace PACKAGE body LABELTARGETKEYWORD
as
/**
@param varcher tableName: the name of table I want to work on
@param varchar colName: the name of clob column
@param varchar targetWord: the word I want to find in the column
@param varchar newColName: the name of new column which store label of clob
*/
PROCEDURE mainProc(tableName varchar, colName varchar,targetWord varchar,newColName varchar2)
as
type c_RecordCur is ref cursor;
c_sRecordCur c_recordCur;
/*other variables*/
begin
/*(1) check whether column of newColName exist
(2) if not, alter add table of newColName
(3) open cursor for retrieving clob
(4) loop cursor
(5) update set the value in newColName accroding to func labelword return
(6) close cursor and commit*/
end mainProc;
function labelWord(sRecord VARCHAR2,targetWord varchar2) return boolean...
function ifColExist(tableName varchar2,newColName varchar2) return boolean...
END LABELTARGETKEYWORD;
Большинство DML и DDL написаны в динамическом SQL-формате.
Проблема в том, что когда я пишу (5) часть, я замечаю: «Где текущийПредложение не может быть использовано в ref-курсоре или динамическом SQL-выражении.Поэтому мне нужно изменить план.
Я пытался использовать запись (rowid, label) для сохранения результата и изменения таблицы позже. (Таблица будет использоваться только двумя людьми в моей группе, поэтому выигралне будет проблемы блокировки и изменения данных).Но я нахожу, потому что я пытаюсь использовать динамический sql, поэтому на самом деле мне нужно определить ref курсор с возвратом определенного% rowtype и, в основном, всех других переменных% type в динамическом SQL-выражении.Что заставляет меня чувствовать, что в моем методе что-то не так.
Мой вопрос:
Если есть способ определить% type в динамическом sql?Тип привязки к переменной в динамическом SQL?
Может кто-нибудь подсказать, как написать эту (5) часть в динамическом SQL?
Разве я не должен так оформлять свою программу?
Разве это не способ использования динамического SQL или PLSQL?
Я очень плохо знаком с PL / SQL.Большое спасибо.