хранимые функции для sqlite

skomoroh2

Новичок
хранимые функции для sqlite

как сделать хранимку для sqlite с sql-запросами?


если юзать PDO::sqliteCreateFunction, то придется каждый раз внутри функции содавать обьект pdo?


если конкретно, то нужно:

есть табличка:
CREATE TABLE "words" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , "word" VARCHAR)
с уникальным ключом по полю word
CREATE UNIQUE INDEX "key_word" ON "words" ("word" ASC)

нужно написать функцию, которая возвращает id слова по его значению, если слова нету, то его вставить и вернуть id
то есть, сделать следущий код как хранимку
PHP:
$sth1 = $db->prepare( "select id from word where word=?" );
$sth2 = $db->prepare("insert into word ( word ) values ( ? )");
$sth1->execute( array( $word ) );
if(  $sth1->rowCount() > 0 )
{
    $id = $sth1->fetchColumn();
}
else
{
    $sth2->execute( array( $word ) );
    $word_ids[$key] = $db->lastInsertId(); 				
}
 

FractalizeR

Новичок
Это не совсем хранимка, это UDF, которая существует в течение времени жизни объекта PDO. Думаю, что другого варианта нет. sqlite_create_function можно считать аналогом.

если юзать PDO::sqliteCreateFunction, то придется каждый раз внутри функции содавать обьект pdo?
Видимо, да. Через global использовать тот же PDO объект скорее всего не получится, поскольку в документации сказано "An application-defined function is permitted to call other SQLite interfaces. However, such calls must not close the database connection nor finalize or reset the prepared statement in which the function is running." А любая попытка выполнить другой SQL оператор будет считаться как reset, я полагаю.

Думаю, лучше в данном случае с UDF вообще не заморачиваться. Написать обычную PHP функцию, которая делает все, что вам нужно
 
Сверху