Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / привязка параметров в хранимую процедуру / 7 сообщений из 7, страница 1 из 1
27.09.2006, 12:20:54
    #34015299
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
Добрый день!
Есть, например, запрос, оформленный в виде хранимой процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
q2 = "BEGIN INSERT INTO test (id, name) VALUES (:id, :val); END;";
CallableStatement cstmt = conn.prepareCall(q2);
cstmt.setInt( 1 ,  13 );
cstmt.setString( 2 , "txt txt");
cstmt.executeUpdate();
...
Все работает нормально. Но как привязывать (IN)значения не по порядковому индексу параметра, а по его имени:
Код: plaintext
1.
2.
cstmt.setInt("id",  13 );
cstmt.setString("val", "txt txt");
- выдают "java.sql.SQLException: Incorrectly set or registered parameters."

Код: plaintext
1.
2.
cstmt.setInt(":id",  13 );
cstmt.setString(":val", "txt txt");

- тоже самое.
1. Как это сделать? И для чего вообще тогда существуют <callablestmt>.setXXX с первым параметром - строкой? Разве туда не имя параметра указывается? Ни в спеке, ни в oracle jdbc faq примеров по этому поводу не нашел.

2. Мне нужно назначить параметры на единый pl/sql-ник с несколькими запросами:
Код: plaintext
1.
2.
3.
4.
BEGIN 
DELETE FROM test WHERE id = :id AND val = :val;
INSERT INTO test (id, name) VALUES (:id, :val); 
END;

И что, каждый раз один и тот же параметр по новой через индексы переназначать?
...
Рейтинг: 0 / 0
27.09.2006, 12:52:29
    #34015481
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
Привязка параметров по имени работает в драйверах от 10-ки, но не везде, не во всех случаях. setXXX() с первым параметром-строкой описаны в интерфейсах JDBC, поэтому они есть, но имхо недореализованы. Более того, ораклы лепят свои методы, например, OraclePreparedStatement.setStringAtName().

Примеры есть тут: http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/oracle10g/index.html , например, Named Parameters Sample
...
Рейтинг: 0 / 0
27.09.2006, 13:02:03
    #34015531
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
ddockerДобрый день!
Есть, например, запрос, оформленный в виде хранимой процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
q2 = "BEGIN INSERT INTO test (id, name) VALUES (:id, :val); END;";
CallableStatement cstmt = conn.prepareCall(q2);
cstmt.setInt( 1 ,  13 );
cstmt.setString( 2 , "txt txt");
cstmt.executeUpdate();
...

Это не ХП. Это анонимный блок PL/SQL.
...
Рейтинг: 0 / 0
27.09.2006, 16:23:10
    #34016358
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
Timm
Это не ХП. Это анонимный блок PL/SQL.
Да, конечно.

А как кто поступает с этим?
Ориентироваться на jdbc и вынужденно привязывать по номеркам или писать под OracleStatement-ы, а потом глядишь и jdbc поправят?

И еще: действительно ли такие вот анонимные блоки значительно проигрывают по производительности PreparedStatement?
...
Рейтинг: 0 / 0
27.09.2006, 17:26:15
    #34016621
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
ddocker Timm
Это не ХП. Это анонимный блок PL/SQL.
Да, конечно.

А как кто поступает с этим?
Ориентироваться на jdbc и вынужденно привязывать по номеркам или писать под OracleStatement-ы, а потом глядишь и jdbc поправят?

И еще: действительно ли такие вот анонимные блоки значительно проигрывают по производительности PreparedStatement?
1. Бинд по имени c драйверами 10ки работает только с ХП.
2. Смотря как использовать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DROP TABLE TEST;
CREATE TABLE TEST (ID INT, val VARCHAR2( 30 ));

CREATE OR REPLACE PROCEDURE test_1(p_id INT, p_val VARCHAR2) AS
BEGIN
    INSERT INTO test (id, val) VALUES (p_id, p_val);
END;
/

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
 import  java.sql.*;
 class  test 
{
     public   static   final   int  cnt =  1000 ;
     public   static   void  main(String[] args)  throws  Exception
    {
         Class .forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test", "tim", "t");

        CallableStatement cstmt = conn.prepareCall("BEGIN test_1(?, ?); END;");
         long  t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=cnt; i++)
        {
            cstmt.setInt("p_id", i);
            cstmt.setInt("p_val", i);
            cstmt.executeUpdate();
        }
        System.out.println(System.currentTimeMillis() - t0);

        cstmt = conn.prepareCall("BEGIN test_1(?, ?); END;");
        t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=cnt; i++)
        {
            cstmt.setInt("p_id", i);
            cstmt.setInt("p_val", i);
            cstmt.addBatch();
        }
        cstmt.executeBatch();
        System.out.println(System.currentTimeMillis() - t0);
        
        PreparedStatement pstmt = conn.prepareStatement("insert into test(id, val) values(?, ?)");
        t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=cnt; i++)
        {
            pstmt.setInt( 1 , i);
            pstmt.setInt( 2 , i);
            pstmt.execute();
        }
        System.out.println(System.currentTimeMillis() - t0);
        
        pstmt = conn.prepareStatement("insert into test(id, val) values(?, ?)");
        t0 = System.currentTimeMillis();
         for  ( int  i =  0 ; i <=  10 *cnt; i++)
        {
            pstmt.setInt( 1 , i);
            pstmt.setInt( 2 , i);
            pstmt.addBatch();
        }
        System.out.println(System.currentTimeMillis() - t0);
        conn.close();
    }
}
Код: plaintext
1.
2.
3.
1406
969
718
125
...
Рейтинг: 0 / 0
27.09.2006, 18:31:01
    #34016890
ddocker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
Не удивительно что в 5 раз быстрее даже на 10-кратном объёме:
pstmt.executeBatch() после последнего цикла не делается. ;(
...
Рейтинг: 0 / 0
27.09.2006, 18:44:02
    #34016931
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
привязка параметров в хранимую процедуру
ddockerНе удивительно что в 5 раз быстрее даже на 10-кратном объёме:
pstmt.executeBatch() после последнего цикла не делается. ;(
потерялось при копировании.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / привязка параметров в хранимую процедуру / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]