(string) Connect to the database as this username.
* password => (string) Password associated with the username.
* database => Either the name of the local Oracle instance, or the
* name of the entry in tnsnames.ora to which you want to connect.
*
* @todo fix inconsistency between “database” used here and “dbname” use elsewhere
* @var array
*/
protected $_config = array(
‘dbname’ => null,
‘username’ => null,
‘password’ => null,
);
protected $_execute_mode = OCI_COMMIT_ON_SUCCESS;
/**
* Constructor.
*
* $config is an array of key/value pairs containing configuration
* options. These options are common to most adapters:
*
* username => (string) Connect to the database as this username.
* password => (string) Password associated with the username.
* database => Either the name of the local Oracle instance, or the
* name of the entry in tnsnames.ora to which you want to connect.
*
* @param array $config An array of configuration keys.
*/
public function __construct($config)
{
// make sure the config array exists
if (! is_array($config)) {
throw new Zend_Db_Adapter_Exception(‘must pass a config array’);
}
// we need at least a dbname
if (! array_key_exists(‘password’, $config) || ! array_key_exists(‘username’, $config)) {
throw new Zend_Db_Adapter_Exception(‘config array must have at least a username and a password’);
}
// @todo Let this protect backward-compatibility for one release, then remove
if (array_key_exists(‘database’, $config) || ! array_key_exists(‘dbname’, $config)) {
$config['dbname'] = $config['database'];
unset($config['database']);
trigger_error(“Deprecated config key ‘database’, use ‘dbname’ instead.”, E_USER_NOTICE);
}
// keep the config
$this->_config = array_merge($this->_config, (array) $config);
// create a profiler object
$enabled = false;
if (array_key_exists(‘profiler’, $this->_config)) {
$enabled = (bool) $this->_config['profiler'];
unset($this->_config['profiler']);
}
$this->_profiler = new Zend_Db_Profiler($enabled);
}
/**
* Creates a connection resource.
*
* @return void
*/
protected function _connect()
{
/**
* @todo should check resource here
*/
if ($this->_connection) {
return;
}
// check the connection
if (!$this->_connection) {
throw new Zend_Db_Adapter_Oracle_Exception(oci_error());
}
}
/**
* Returns an SQL statement for preparation.
*
* @param string $sql The SQL statement with placeholders.
* @return Zend_Db_Statement_Oracle
*/
public function prepare($sql)
{
$this->_connect();
$stmt = new Zend_Db_Statement_Oracle($this, $sql);
$stmt->setFetchMode($this->_fetchMode);
return $stmt;
}
/**
* Gets the last inserted ID.
*
* @param string $tableName name of table associated with sequence
* @param string $primaryKey not used in this adapter
* @return integer
*/
public function lastInsertId($tableName = null, $primaryKey = null)
{
if (!$tableName) {
throw new Zend_Db_Adapter_Exception(“Sequence name must be specified”);
}
$this->_connect();
$data = $this->fetchCol(“SELECT $tableName.currval FROM dual”);
return $data[0]; //we can’t fail here, right? if the sequence doesn’t exist we should fail earlier.
}
/**
* Returns a list of the tables in the database.
*
* @return array
*/
public function listTables()
{
$this->_connect();
$data = $stmt->fetchCol(‘SELECT table_name FROM all_tables’);
return $data;
}
/**
* Returns the column descriptions for a table.
*
* @return array
*/
public function describeTable($table)
{
$table = strtoupper($table);
$sql = “SELECT column_name, data_type, data_length, nullable, data_default from all_tab_columns WHERE table_name=’$table’ ORDER BY column_name”;
$result = $this->query($sql);
while ($val = $result->fetch()) {
$descr[$val['column_name']] = array(
‘name’ => $val['column_name'],
‘notnull’ => (bool)($val['nullable'] === ‘N’), // nullable is N when mandatory
‘type’ => $val['data_type'],
‘default’ => $val['data_default'],
‘length’ => $val['data_length']
);
}
return $descr;
}
/**
* Leave autocommit mode and begin a transaction.
*
* @return void
*/
protected function _beginTransaction()
{
$this->_setExecuteMode(OCI_DEFAULT);
}
/**
* Commit a transaction and return to autocommit mode.
*
*/
protected function _commit()
{
if (!oci_commit($this->_connection)) {
throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
}
$this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
}
/**
* Roll back a transaction and return to autocommit mode.
*
* @return void
*/
protected function _rollBack()
{
if (!oci_rollback($this->_connection)) {
throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
}
$this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
}
/**
* Set the fetch mode.
*
* @param int $mode A fetch mode.
* @return void
* @todo Support FETCH_CLASS and FETCH_INTO.
*/
public function setFetchMode($mode)
{
switch ($mode) {
case Zend_Db::FETCH_NUM: // seq array
case Zend_Db::FETCH_ASSOC: // assoc array
case Zend_Db::FETCH_BOTH: // seq+assoc array
case Zend_Db::FETCH_OBJ: // object
$this->_fetchMode = $mode;
break;
default:
throw new Zend_Db_Adapter_Exception(‘Invalid fetch mode specified’);
break;
}
}
/**
* Quote a raw string.
*
* @param string $value Raw string
* @return string Quoted string
*/
protected function _quote($value)
{
//@todo should we throw an exception here?
return $value;
}
/**
* Quotes an identifier.
*
* @param string $ident The identifier.
* @return string The quoted identifier.
*/
public function quoteIdentifier($ident)
{
//@todo should we throw an exception here?
return $ident;
}
/**
* Adds an adapter-specific LIMIT clause to the SELECT statement.
*
* @return string
*/
public function limit($sql, $count, $offset)
{
/*
Oracle doesn’t have a LIMIT statement implementation, so we have to “emulate” it using rnum
*/
$limit_sql = “SELECT
zsubselect2.*
FROM
(
SELECT
rownum zrownum,
zsubselect1.*
FROM
(
“.$sql.”
)
zsubselect1
)
zsubselect2
WHERE
zrownum BETWEEN “.$offset.” AND “.($offset+$count).”
“;
return $limit_sql;
}
private function _setExecuteMode($mode) {
switch($mode) {
case OCI_COMMIT_ON_SUCCESS:
case OCI_DEFAULT:
case OCI_DESCRIBE_ONLY:
$this->_execute_mode = $mode;
break;
default:
throw new Zend_Db_Adapter_Exception(‘wrong execution mode specified’);
break;
}
}
public function _getExecuteMode() {
return $this->_execute_mode;
}
}
naagii
August 2, 2011 at 2:35 pm
Materialized View – ийн талаар дэлгэрэнгүй тайлбарлаж өгнө үү. Ямар онцлог давуу талтай болоод онцлог шинжүүдийнх нь талаар. Мөн dense_rank функцийг сайн ойлгодоггүй ээ.
bokhoo
April 6, 2011 at 11:00 am
Express гэж байдаг юм болов уу даа. Бага үзүүлэлттэй компьютер дээр суулгах гэж байгаа бол анх бааз аа үүсгэхдээ санах ойн хэдэн хувийг эзэлэх вэ гэдэг дээр нь анхаарч тохируулаарай.
lhagva
April 6, 2011 at 10:54 am
pc nd deeree oracle sudlah gej bgaa bol oracle express huvilbariig ashiglasan deer gej bodoj bna. Tiimuu bokhoo
bokhoo
March 21, 2011 at 4:16 pm
Намайг шалгаж байгаа юм уу хэхэ. мм ажиллахгүй ээ энэ. declare – ийг жирийн нэг block бичиж байхад ашиглана. Procedure дотор биш.
declare
l_loops number := 0;
begin
dbms_output.put_line(‘Before my loop’);
loop
exit when l_loops > 4;
dbms_output.put_line(‘Looped ‘ || l_loops || ‘ times’);
l_loops := l_loops + 1;
end loop;
dbms_output.put_line(‘After my loop’);
end;
Procedure дотор declare ашиглахгүй.
Шууд var1 nvarchar2(30); гэж ашиглана. Харин begin end; блок дотор select – ийг ашиглахдаа cursor юм уу into – г ашиглана. select var1,var2 into value1,value2 from dual гэх мэт ….
hi
March 21, 2011 at 3:34 pm
declare var1 nvarchar2(30);
var2 nvarchar2(30);
begin
var1 := ’12′;
var2 := ’12′;
select var1 as var1, var2 as var2 from dual;
end;
end yamar aldaa bna uzeed uguuch
dashka
January 10, 2011 at 5:42 pm
hi ahaa tuslaach bi it surdag yum oracle sudlah gesiin yaj tataj awah uu
bokhoo
January 5, 2011 at 9:48 am
Oracle – суулгасаныхаа дараа Start цэснээсээ Oracle-Configuration and Migration tools-Database configuration Assistance – руу ороод бааз үүсгэж болно. Анх сурч байгаа хүмүүсд энэ нь арай ойлгомжтой. Бааз үүсгэж байхдаа санах ой болон бусад тохиргоонуудыг хийж болно. Харин Коммандын мөрнөөс үүсцэн баазынхаа бүх тохиргоог хийх боломжтой
bagii
January 4, 2011 at 4:53 pm
bayrlalaa. nzaa oracle deer baaz uusgehdee sanah oin huviarlalt ooroor helbel table space, blok extend geh zereg obiektuudiin tootsoolliig herhen hiih ve. defaultaar bish hereglegchiin baidlaar uusgeh gej bga ym l daa. block size, extend geh zergeer hemjeeg duriin bdlaar. tuslaach
enkhmunkh
December 19, 2010 at 6:23 pm
Bokhood:xeregtei zowlogoo ikh baidag mash chuxal yum bichdeg yum bna xoich vyee demjij erdem medlegee xaramgvi ogch baigaad bayarlalaa
xvsex zvil bna oracle-iin mongol xel deer xicheel baiwal tawij tuslaach
Hatanaa
December 16, 2010 at 10:22 am
Sain bnu? bi uuruus chin neg zuil asuuh gsn yumaa ni diplomiin ajil deeree toli bichig hiih gsn yumaa. eronhidooo http://www.bolor-toli.com shig yaaj hiih ee unendee medhgui bnaa nadad zuwlguu uguuch pls
baagii
July 19, 2010 at 2:46 pm
medlegeese huvaaltsaj bgad chamd mash bayrlaj bna. Oracle-iin objectuudiin talaar (index, Synonyms, Sequences and cluster)-iin talaar jo tailbar ogooch. Ylanguya index-iin talaar.
baagii
June 16, 2010 at 5:45 pm
oracle.com-s tatah ged chadsangui. herhen tatah talaar zaavar ch ymar neg zuil heleech. oracle 8i-g tatah ged er chadsangui
bokhoo
January 13, 2010 at 9:50 am
ямар үйлдлийн систем дээр суулгаад байгаа вэ? Vista дээр 9i суухгүй. Түүнээс дээш хувилбар сууна
anu
January 12, 2010 at 10:33 pm
bi oracle 9i suulgah gesen chini jrew.exe gej yum alga geed baihiiin teriig yaahuu
bokhoo
August 24, 2009 at 10:22 am
ok
Soko
August 22, 2009 at 4:45 pm
ok.utgaa olgochihson.
bokhoo
August 22, 2009 at 3:46 pm
TOAD International гэж бий … гэхдээ заавал бааз дээрээ тохиргоо хийнэ бас …
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG – регистерийн
AMERICAN_AMERICA.AL32UTF8 утга байх ёстой …
Soko
August 22, 2009 at 2:52 pm
toad 9.0 oos deesh mongol font tanidag gesen tegeed suulgah geed l bj bn.
bokhoo
August 22, 2009 at 12:25 pm
бааз шинээр үүсгэж байхдаа UTF-8 гэж зааж өгдөг юм.
Soko
August 21, 2009 at 8:53 pm
ok.medeelel ogch baigaad thanks.baazaa uusgeed mongoloor bichih gesen chini baahan үүүүүү bolchih yum.tohirgoog ni yaj oorchloh we.
bokhoo
August 21, 2009 at 5:33 pm
Яахав дээ oracle – ийн дэмждэг sql байхгүй юу. insert delete update procedure ect .. бичнэ ш дээ одоо суулгацан хүн чинь…
Soko
August 21, 2009 at 4:43 pm
PL
Soko
August 21, 2009 at 4:37 pm
hi.PLSQL ene yu yum.yund heregtei bdag yum
bokhoo
August 20, 2009 at 9:15 pm
PLSQL гэж судлана даа одоо…
Soko
August 20, 2009 at 7:02 pm
Ura. Suulgachihsan.Toad-iig ni ch bas suulgachihlaa.yamar goy we.heden odor zuuraldwaa.baasaa uusgechihlee.ogogdloo yaj oruuldag bilee.
Soko
August 20, 2009 at 7:01 pm
Suulgachihsan.Toad-iig ni ch bas suulgachihlaa.yamar goy we.heden odor zuuraldwaa.baasaa uusgechihlee.ogogdloo yaj oruuldag bilee.
bokhoo
August 19, 2009 at 6:53 pm
амжилт
Soko
August 19, 2009 at 4:22 pm
Thanks.suulgah gesen zai hureltsehgui bna geed bhaar ni zarim yumaa ustgaj bna.yamar ch baisan suulgaad neg baaz uusgej uzeh gesen yumaa.
bokhoo
August 18, 2009 at 9:33 am
яаж бааз үүсгэх вэ гэдэг ээ өөрөө үзчих амархан. суулгаж дууссаны дараа all programs – д чинь ORA-*** иймэрхүү нэртэй файл үүссэн байнаа. Тэндээс уншиж байгаад л Database гэсэн рүү нь ороод явчихна. Харин бүүр эхнээсээ суулгахдаа Client, Server суулгахаа сонгодог юм шүү…
bokhoo
August 18, 2009 at 9:19 am
Oracle сууж байхдаа датабэйс ээ суулгах уу гэж асуудаг. Default – аар нь явуулбал нэг бааз суучихна. Дараа нь суулгаж бас болно. Өөрт нь бэлэн Tool байгаа. Ер нь бага хэмжээний database – д oracle тохиромжгүй санагдсан. mssql – ээс ялгаатай нэг тал нь 1 ширхэг Database үүсгэхэд л санах ой, диск гээд л маш том зай эзэлдэг. сервер биш жирийн бидний pc дээр бол 1 – ээс их бааз бол дийлэхгүй юм шиг надад санагдсан….
Soko
August 17, 2009 at 8:21 pm
hi.medlegeesee huwaaltsaj bgad bayarlalaa.oracle 9i her bol.suulgah geed tataj awch bna.barag l 1 odor boloh yum shig bna.oracle deer yaj database uusgedeg yum be.help me.jijig hemjeenii baaz uusgeh gesen yum.yaraltai hariu uguurei.
bokhoo
July 20, 2009 at 4:50 pm
шууд database хооронд бол сайн мэдэхгүй юм аа Tool байж магадгүй. Дунд нь жижиг програм бичээд уншаад бичиж болно. маш амархан. Жишээ нь: хамгийн энгийнээр нэг Grid тавиад дүүн дэрээ дата-гаа уншаад нөгөө бааз руугаа бичиж болно…
Zaya
July 20, 2009 at 3:05 pm
hi.medlegeesee huvaaltsaj baigaad chamd mash ih bayarlalaa.Oracle deer baigaa data gaa mysql ruu horvuuleh gesen yum.delphi deer boloh uu? bolvol yaaj boloh ve? bolohgui bol visual basice deer yaaj bichih be please? tuslaach
bokhoo
June 26, 2009 at 4:36 pm
болно оо
galsaa
June 26, 2009 at 4:21 pm
Oracle Database Software-iig ni tataj avahad boloh u
bokhoo
June 26, 2009 at 9:04 am
http://www.oracle.com татаж авах чөлөөтэй. бас юм аа хийхэд ч чөлөөтэй. гэвч чи өөрийн хийсэн зүйлээрээ ашиг олох тэр үед лиценз авахгүй бол асуудалд орно хэхэ
galsaa
June 26, 2009 at 12:00 am
oracle-iig haanaas oloh ve
bokhoo
June 23, 2009 at 5:52 pm
DVD – д багтах байх. 3+ GB байдаг
galsaa
June 23, 2009 at 5:13 pm
oracle ali hir hemjeetei bdg ve. cd-nd bagtah uu
doogii
May 6, 2009 at 10:50 am
get post 2-iin yalgaa n yu yum bol oo.
tegeed bas fetch array -iin talaar delgerengui medeelel baiwal olj ugch tusaach.
Мөнхбат
February 10, 2009 at 6:26 pm
Ингэхэд Oralce гээд биччихжээ
bokhoo
June 23, 2008 at 12:13 pm
зөвлөхөд: http://www.google.com/codesearch
bokhoo
June 23, 2008 at 12:12 pm
(string) Connect to the database as this username.
* password => (string) Password associated with the username.
* database => Either the name of the local Oracle instance, or the
* name of the entry in tnsnames.ora to which you want to connect.
*
* @todo fix inconsistency between “database” used here and “dbname” use elsewhere
* @var array
*/
protected $_config = array(
‘dbname’ => null,
‘username’ => null,
‘password’ => null,
);
protected $_execute_mode = OCI_COMMIT_ON_SUCCESS;
/**
* Constructor.
*
* $config is an array of key/value pairs containing configuration
* options. These options are common to most adapters:
*
* username => (string) Connect to the database as this username.
* password => (string) Password associated with the username.
* database => Either the name of the local Oracle instance, or the
* name of the entry in tnsnames.ora to which you want to connect.
*
* @param array $config An array of configuration keys.
*/
public function __construct($config)
{
// make sure the config array exists
if (! is_array($config)) {
throw new Zend_Db_Adapter_Exception(‘must pass a config array’);
}
// we need at least a dbname
if (! array_key_exists(‘password’, $config) || ! array_key_exists(‘username’, $config)) {
throw new Zend_Db_Adapter_Exception(‘config array must have at least a username and a password’);
}
// @todo Let this protect backward-compatibility for one release, then remove
if (array_key_exists(‘database’, $config) || ! array_key_exists(‘dbname’, $config)) {
$config['dbname'] = $config['database'];
unset($config['database']);
trigger_error(“Deprecated config key ‘database’, use ‘dbname’ instead.”, E_USER_NOTICE);
}
// keep the config
$this->_config = array_merge($this->_config, (array) $config);
// create a profiler object
$enabled = false;
if (array_key_exists(‘profiler’, $this->_config)) {
$enabled = (bool) $this->_config['profiler'];
unset($this->_config['profiler']);
}
$this->_profiler = new Zend_Db_Profiler($enabled);
}
/**
* Creates a connection resource.
*
* @return void
*/
protected function _connect()
{
/**
* @todo should check resource here
*/
if ($this->_connection) {
return;
}
if (isset($this->_config['dbname'])) {
$this->_connection = oci_connect($this->_config['username'], $this->_config['password'], $this->_config['dbname']);
} else {
$this->_connection = oci_connect($this->_config['username'], $this->_config['password']);
}
// check the connection
if (!$this->_connection) {
throw new Zend_Db_Adapter_Oracle_Exception(oci_error());
}
}
/**
* Returns an SQL statement for preparation.
*
* @param string $sql The SQL statement with placeholders.
* @return Zend_Db_Statement_Oracle
*/
public function prepare($sql)
{
$this->_connect();
$stmt = new Zend_Db_Statement_Oracle($this, $sql);
$stmt->setFetchMode($this->_fetchMode);
return $stmt;
}
/**
* Gets the last inserted ID.
*
* @param string $tableName name of table associated with sequence
* @param string $primaryKey not used in this adapter
* @return integer
*/
public function lastInsertId($tableName = null, $primaryKey = null)
{
if (!$tableName) {
throw new Zend_Db_Adapter_Exception(“Sequence name must be specified”);
}
$this->_connect();
$data = $this->fetchCol(“SELECT $tableName.currval FROM dual”);
return $data[0]; //we can’t fail here, right? if the sequence doesn’t exist we should fail earlier.
}
/**
* Returns a list of the tables in the database.
*
* @return array
*/
public function listTables()
{
$this->_connect();
$data = $stmt->fetchCol(‘SELECT table_name FROM all_tables’);
return $data;
}
/**
* Returns the column descriptions for a table.
*
* @return array
*/
public function describeTable($table)
{
$table = strtoupper($table);
$sql = “SELECT column_name, data_type, data_length, nullable, data_default from all_tab_columns WHERE table_name=’$table’ ORDER BY column_name”;
$result = $this->query($sql);
while ($val = $result->fetch()) {
$descr[$val['column_name']] = array(
‘name’ => $val['column_name'],
‘notnull’ => (bool)($val['nullable'] === ‘N’), // nullable is N when mandatory
‘type’ => $val['data_type'],
‘default’ => $val['data_default'],
‘length’ => $val['data_length']
);
}
return $descr;
}
/**
* Leave autocommit mode and begin a transaction.
*
* @return void
*/
protected function _beginTransaction()
{
$this->_setExecuteMode(OCI_DEFAULT);
}
/**
* Commit a transaction and return to autocommit mode.
*
*/
protected function _commit()
{
if (!oci_commit($this->_connection)) {
throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
}
$this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
}
/**
* Roll back a transaction and return to autocommit mode.
*
* @return void
*/
protected function _rollBack()
{
if (!oci_rollback($this->_connection)) {
throw new Zend_Db_Adapter_Oracle_Exception(oci_error($this->_connection));
}
$this->_setExecuteMode(OCI_COMMIT_ON_SUCCESS);
}
/**
* Set the fetch mode.
*
* @param int $mode A fetch mode.
* @return void
* @todo Support FETCH_CLASS and FETCH_INTO.
*/
public function setFetchMode($mode)
{
switch ($mode) {
case Zend_Db::FETCH_NUM: // seq array
case Zend_Db::FETCH_ASSOC: // assoc array
case Zend_Db::FETCH_BOTH: // seq+assoc array
case Zend_Db::FETCH_OBJ: // object
$this->_fetchMode = $mode;
break;
default:
throw new Zend_Db_Adapter_Exception(‘Invalid fetch mode specified’);
break;
}
}
/**
* Quote a raw string.
*
* @param string $value Raw string
* @return string Quoted string
*/
protected function _quote($value)
{
//@todo should we throw an exception here?
return $value;
}
/**
* Quotes an identifier.
*
* @param string $ident The identifier.
* @return string The quoted identifier.
*/
public function quoteIdentifier($ident)
{
//@todo should we throw an exception here?
return $ident;
}
/**
* Adds an adapter-specific LIMIT clause to the SELECT statement.
*
* @return string
*/
public function limit($sql, $count, $offset)
{
/*
Oracle doesn’t have a LIMIT statement implementation, so we have to “emulate” it using rnum
*/
$limit_sql = “SELECT
zsubselect2.*
FROM
(
SELECT
rownum zrownum,
zsubselect1.*
FROM
(
“.$sql.”
)
zsubselect1
)
zsubselect2
WHERE
zrownum BETWEEN “.$offset.” AND “.($offset+$count).”
“;
return $limit_sql;
}
private function _setExecuteMode($mode) {
switch($mode) {
case OCI_COMMIT_ON_SUCCESS:
case OCI_DEFAULT:
case OCI_DESCRIBE_ONLY:
$this->_execute_mode = $mode;
break;
default:
throw new Zend_Db_Adapter_Exception(‘wrong execution mode specified’);
break;
}
}
public function _getExecuteMode() {
return $this->_execute_mode;
}
}
bokhoo
June 23, 2008 at 11:59 am
за удахгүй тавина аа. удсанд уучлаарай
channa
June 19, 2008 at 5:59 pm
hi, php code-r oracle ruu yaj holbogdoh ve?
code-g ni tavij uguuch
bokhoo
May 2, 2008 at 2:24 am
hi
same
April 30, 2008 at 10:32 am
hi
bokhoo
April 15, 2008 at 12:50 am
C# дээр Oracle – ын StoredProcedure ажиллуулах…
public void Execute(string ConnStr, string Query)
{
OracleConnection conn = null;
OracleCommand cmd = null;
try
{
conn = new OracleConnection(ConnStr);
conn.Open();
if (conn.State.ToString().Equals(“Open”))
{
cmd = new OracleCommand(Query, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
conn.Close();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
cmd = null;
conn = null;
}
}
bokhoo
March 28, 2008 at 5:13 am
Шинээр