Изменение типа столбца

Здравствуйте,
видел в FAQ (в пункте 4.3 ) подобный вопрос, но у меня , как мне кажется, все немного сложнее.
Нужно превратить varchar(2000) в blob. На сколько я знаю, в postgres большие объекты(blob) хранятся в специальной таблице, а собственно в таблице данных хранится лишь ссылка (oid).
Возможно ли такое преобразование средствами СУБД (может через временную колонку) ? Если да, то как мне это сделать?

Заранее благодарен за помощь всем откликнувшимся!

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Не поручусь за

Не поручусь за точность, но я бы попробовал
1. Просто ALTER TABLE таблица ALTER COLUMN колонка TYPE ....

Если так не сработает, то
2.
CREATE TABLE tmp_tbl AS SELECT .... из первоначальной таблицы
далее
CREATE TABLE tmp1_tbl AS SELECT ... с JOIN'ом первоначальной таблицы и tmp_tbl и явным приведелением типа.
и далее переименовать tmp1_tbl в первоначальную таблицу

спасибо

спасибо большое за ответ, но вот собственно приведение типа и не работает.
Такое ощущение что нужно вначале создать large object из моих текстовых данных, и получить oid этого объекта, а затем уже вставить этот oid в мое старое поле вместо текстовых данных. Вероятно, нужно пользоваться дополнительными функциями создающими двоичный объект из данных другого поля. Может знает кто как это решить или сталкивался с подобным ?

Нет, мне

Нет, мне кажется, что вы не должны принимать во внимание внутрениий способ хранения в PostgreSQL. В конце концов - это внутреннее дело PostgreSQL. Если не работает приведение типа, посмотрите в руководстве функции преобразования строк в нужный вам тип и воспользуйтесь ими.

groovy-Скрипт

/*
 * Чудо-скрипт, который конвертирует данные из varchar в blob для папки.
 * Сервер НЕ должен работать!!!
 * Только для POSTGRES!!!
 * Groovy не ниже 1.5.6!!!
 */
import groovy.sql.Sql
import java.io.*;
 
println 'start script...'
 
try{
	dbUrl = args[0]
	user = args[1]
	password = args.length > 2 ? args[2] : ''
	currDir = args[3]
}
catch(Exception e){
	println 'You have not enter the arguments properly'
	RETURN
}
 
this.class.classLoader.rootLoader.addURL( new URL("file:///${currDir}ojdbc14.jar") )
this.class.classLoader.rootLoader.addURL( new URL("file:///${currDir}log4j-1.2.6.jar") )
this.class.classLoader.rootLoader.addURL( new URL("file:///${currDir}postgresql.jar") )
 
 
def props = new Properties()
props.put('ping-statement', 'SELECT CAST(1 AS INTEGER)')
props.put('user', user)
props.put('password', password)
 
def sql = Sql.newInstance(dbUrl, props, 'org.postgresql.Driver')
 
//-------------//
//создаем временный столбец
sql.execute('''ALTER TABLE iq_folders ADD COLUMN "description1" oid''')
 
//собственно конвертирование данных
// всключить режим редактирования
sql.resultSetConcurrency = 1008//java.sql.ResultSet.CONCUR_UPDATABLE
 
sql.eachRow('''select * from IQ_FOLDERS'''){
    String DESC = it.description
 
    def oid = -1
    sql.eachRow("select lo_creat(-1)"){
        oid = it[0]
    }
    sql.execute("select lowrite(lo_open(${oid}, -1), convert_to(${desc}, 'UTF8'))")
    it.description1 = oid
}
 
// отключить режим редактирования
sql.resultSetConcurrency = 1007//java.sql.ResultSet.CONCUR_READ_ONLY
 
//удаление старого столбца и переименование нового
sql.execute('''alter table IQ_FOLDERS drop "description"''');
sql.execute('''ALTER TABLE iq_folders RENAME "description1"  TO "description"''');
 
println 'well done'

написать функцию на внутреннем языке postgres у меня не получилось, зато с помощью groovy и бат-файла получилось вот это извращенство) ну главное работает!
спасибо всем за помощь!

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023